ElasticSearch индексация и сопоставление массивов - PullRequest
0 голосов
/ 05 октября 2018

В настоящее время я строю поиск системы электронной коммерции с помощью ElasticSearch (клиент PHP), но столкнулся с проблемой

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

Проблема, с которой я столкнулся, заключается в том, что у продукта нет цветов

У меня есть следующие поля

id - integer
title - string
codes - array
properties - array
attributes - array

Поэтому, когда я отправляю товар, он выглядит так

id: 1
title: ABC
codes: ['ABC', '123']
properties: ['purple']
attributes: ['large', 'small']

Это работает, как и ожидалось, но когда я пытаюсь отправить что-то вроде этого

id: 2
title: DEF
codes: ['DEF']
properties: []
attributes: []

Выдаетошибка:

{"error": {"root_cause": [{"type": "mapper_parsing_exception", "reason": "сопоставление объектов для [codes] попыталось проанализировать поле [null]как объект, но нашел конкретное значение "}]," type ":" mapper_parsing_exception "," reason ":" объектное сопоставление для [codes] попыталось проанализировать поле [null] как o bject, но нашло конкретное значение "},"status": 400}

Я попытался сопоставить свои поля, используя это для каждого поля (как показано здесь: https://www.elastic.co/guide/en/elasticsearch/reference/current/dynamic.html)

attributes: {
    dynamic: true,
    properties: []
}

Bно это, похоже, не помогает, и в документах говорится, что вы не можете указать тип массива

Может кто-нибудь указать мне правильное направление?

1 Ответ

0 голосов
/ 08 октября 2018

Спасибо apokryfos и Амиру Масуду Заребидаки за комментарии, вместе они дали мне ответ

В итоге я отправил отображение кодов, атрибутов и свойств в виде 'text', и по умолчанию объект являетсясозданные как динамические, чтобы они могли иметь несколько значений

Я также заставил свой код удалить любые пустые массивы, чтобы, если у продукта не было свойств, они не были отправлены

Эти два изменения объединены, имеютрешил мою ошибку

А в случае, если кто-то еще получит эту ошибку, появится сообщение:

Не удалось получить текст на START_OBJECT

Проверьте, что выне отправлять массив с неинкрементными ключами, например:

[attributes] => Array
(
    [0] => Game
    [1] => Chicken
    [2] => Salmon
    [6] => Chicken
)

Я столкнулся с этой проблемой, простое array_values ​​($ attribute) исправило это для меня (PHP)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...