2016-10-26 3 views
1

У меня есть Elastic server (версия 2.3.1) и я пытаюсь использовать официальный PHP client для хранения документов. Структура Я создаю в PHP:PHP Elasticsearch «Set» mapping

$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 
      [tags] => Array 
       (
        [0] => Some tag 
        [2] => Some other tag 
       ) 
     ) 
) 

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

PHP Fatal error: Uncaught Elasticsearch\Common\Exceptions\BadRequest400Exception: {"error":{"root_cause":[{"type":"mapper_parsing_exception","reason":"object mapping for [tags] tried to parse field [null] as object, but found a concrete value"}],"type":"mapper_parsing_exception","reason":"object mapping for [tags] tried to parse field [null] as object, but found a concrete value"},"status":400} in /home/test/test/php/vendor/elasticsearch/elasticsearch/src/Elasticsearch/Connections/Connection.php:655 

Я знаю, что индекс строится на неверном пути:

{ 
    "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, но вместо того, чтобы какой-то другой тип данных, который я смотрел за последние несколько дней.)

Примеры:

[tags] => Array 
      (
      [0] => Some tag 
      [2] => Some other tag 
      [3] => Some other tag 
     ) 
//... 
[tags] => Array 
      (
     ) 

ответ

1

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

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

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

+0

Спасибо за ваш ответ, но этот путь я смогу хранить пустой или, например, 6 тег для документа? У меня есть различные подсчеты тегов, и я не могу определить, сколько из них будет представлено. – Mark

+1

Да, у вас не будет ограничения на размер массива, и ваше сопоставление останется «тегами»: {type: "string"} ', то же, что и для строки. – Pandawan

Смежные вопросы