PHP Elasticsearch & quot; Установить & quot; отображение

У меня есть сервер 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
 знак равно> массив
(
[0] => Какой-то тег
[2] => Какой-то другой тег
)
)
)
[/ NOEDIT]

Первый документ хорошо хранится (и он создает индекс), но как только я пытаюсь вставить документ с другим количеством тегов, я получаю сообщение об ошибке:

PHP Fatal error:  Uncaught Elasticsearch\Common\Exceptions\BadRequest400Exception: {"error":{"root_cause":[{"type":"mapper_parsing_exception","reason":"object mapping for  попытался разобрать field [null] как объект, но нашел конкретное значение "}]," type ":" mapper_parsing_exception "," reason ":" сопоставление объекта для  попытался проанализировать поле [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 но вместо какого-то другого типа данных, который я искал последние несколько дней.)

Примеры:

 знак равно> массив
(
[0] => Какой-то тег
[2] => Какой-то другой тег
[3] => Какой-то другой тег
)
// ...
 знак равно> массив
(
)
[/ NOEDIT]

1

Решение

После array_unique в возвращаемом массиве есть дыры: в вашем примере нет элемента для ключа 1. Таким образом, он индексируется Elasticsearch как карта,
это не то поведение, которое вы хотите.

использование array_merge(array_unique($tags)) в вашем коде это сгенерирует массив без дыр, который будет индексирован как таковой Elasticsearch.

Вам придется удалить свой индекс перед переиндексацией, чтобы восстановить отображение;)

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]