У меня есть сервер Elastic (версия 2.3.1), и я пытаюсь использовать официальный PHP-клиент хранить документы. Структура, которую я создаю в PHP
:
$data = Array(
"index"=> "my_index",
"type" => "my_type",
"id" => $my_generated_id,
"body" => Array(
"name" => $name,
"other_field" => $other_data,
"tags" => array_unique($tags)
)
);
print_r ($ данные):
Array
(
[index] => my_index
[type] => my_type
[id] => AFCDEFGH
[body] => Array
(
[name] => It is my name
[other_field] => some other information
elasticsearchelasticsearch-2.0php знак равно> массив
(
[0] => Какой-то тег
[2] => Какой-то другой тег
)
)
)
[/ NOEDIT]
Первый документ хорошо хранится (и он создает индекс), но как только я пытаюсь вставить документ с другим количеством тегов, я получаю сообщение об ошибке:
PHP Fatal error: Uncaught Elasticsearch\Common\Exceptions\BadRequest400Exception: {"error":{"root_cause":[{"type":"mapper_parsing_exception","reason":"object mapping for elasticsearchelasticsearch-2.0php попытался разобрать field [null] как объект, но нашел конкретное значение "}]," type ":" mapper_parsing_exception "," reason ":" сопоставление объекта для elasticsearchelasticsearch-2.0php попытался проанализировать поле [null] как объект, но нашел конкретное значение "}," status ": 400} в /home/test/test/php/vendor/elasticsearch/elasticsearch/src/Elasticsearch/Connections/Connection.php: 655
[/ NOEDIT]
Я знаю, что индекс построен неправильно:
{
"my_index":{
"aliases":{
},
"mappings":{
"targy":{
"properties":{
"other_field":{
"type":"string"},
"name":{
"type":"string"},
"tags":{
"properties":{
"0":{
"type":"string"},
"2":{
"type":"string"}
}
}
}
}
},
"settings":{
"index":{
"creation_date":"1477414478664",
"number_of_shards":"5",
"number_of_replicas":"1",
"uuid":"yZiN4uUgRXe9vyaN4uWbGg",
"version":{
"created":"2030199"}
}
},
"warmers":{
}
}
}
Как я могу построить отображение в PHP
вручную, чтобы иметь возможность обрабатывать ноль или более тегов одновременно? (Я думаю, что решение не в том, чтобы справиться с этой «сумкой» strings
как array
но вместо какого-то другого типа данных, который я искал последние несколько дней.)
Примеры:
elasticsearchelasticsearch-2.0php знак равно> массив
(
[0] => Какой-то тег
[2] => Какой-то другой тег
[3] => Какой-то другой тег
)
// ...
elasticsearchelasticsearch-2.0php знак равно> массив
(
)
[/ NOEDIT]
После array_unique в возвращаемом массиве есть дыры: в вашем примере нет элемента для ключа 1. Таким образом, он индексируется Elasticsearch как карта,
это не то поведение, которое вы хотите.
использование array_merge(array_unique($tags))
в вашем коде это сгенерирует массив без дыр, который будет индексирован как таковой Elasticsearch.
Вам придется удалить свой индекс перед переиндексацией, чтобы восстановить отображение;)
Других решений пока нет …