Elasticsearch: Поля с нулевым значением в запросах custom_score вызывают ошибки «Нет поля»

Созданный на 9 февр. 2011  ·  5Комментарии  ·  Источник: elastic/elasticsearch

Кажется, есть ошибка при использовании запросов custom_score и попытке оценки на основе полей, которые могут содержать нулевые значения.

Учитывая, что у меня есть:

{"user": {"name": "John", "position": null}}

Когда я запрашиваю, используя custom_score и скрипт, например:

{"script": "_score + doc['position'].value"}

Я получаю следующую ошибку:

ElasticSearchIllegalArgumentException[No field found for [position]]; }]

Если я добавлю другого пользователя:

{"user": {"name": "Jane", "position": 1}}

Все работает нормально.

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

Приведенные выше примеры могут показаться неубедительными, но представьте себе заполнение индексов данными из базы данных, где нет никаких гарантий, что столбец не будет содержать ничего, кроме нулевых значений. Вы можете обойти это, приведя свои поля к строкам с помощью сопоставления, но я определенно предлагаю, чтобы ElasticSearch мог более разумно обрабатывать значение скрипта.

Самый полезный комментарий

Это должно работать:

{"script": "_score + (doc.containsKey('position') ? doc['position'].value : 0)"}

Или, может быть, даже это:

{"script": "_score + (doc['position'] ? doc['position'].value : 0)"}

Тем не менее, при достаточном наборе данных, где хотя бы один документ имеет значение position на каждом осколке, вам не нужна эта проверка, и тогда производительность вашего скрипта будет намного лучше.

Все 5 Комментарий

О, и спасибо за отличный продукт! :-)

Эй,

Это происходит потому, что это поле еще не введено (у него нулевое значение). Как только он будет введен (с одним значением в кластер), он будет работать нормально. Вы также можете определить null-value в сопоставлениях, которые будут индексировать конкретное нулевое значение, когда это поле имеет значение null . Поскольку он не введен, его тип не может быть получен.

Да, я понимаю это. Не было бы лучше, если бы значение сценария возвращало значение null или, по крайней мере, имело бы какую-то функцию для проверки его существования, вместо того, чтобы вызывать исключение и не возвращать никаких результатов?

Например:

{"script": "_score + (doc['position'].present ? doc['position'] : 0)"}

Это должно работать:

{"script": "_score + (doc.containsKey('position') ? doc['position'].value : 0)"}

Или, может быть, даже это:

{"script": "_score + (doc['position'] ? doc['position'].value : 0)"}

Тем не менее, при достаточном наборе данных, где хотя бы один документ имеет значение position на каждом осколке, вам не нужна эта проверка, и тогда производительность вашего скрипта будет намного лучше.

Неустранимая ошибка: Uncaught [NoFieldFound] Поле не найдено: Contact._PloiciesLastApplicationDate0 Попытка: 1 раз. брошенный

Я получаю следующую ошибку при обновлении контакта.

например:-

$checkExist = Infusionsoft_DataService::query(new Infusionsoft_Contact(), array('Phone1' => '(618)-795-0304'));

Я получаю контакт и обновляю контакт на основе номера телефона, но это дает эту ошибку?

Спасибо!

Была ли эта страница полезной?
0 / 5 - 0 рейтинги