2013-06-11 4 views
69

Elasticsearch выбрасывает SearchParseException при анализе запроса, если есть некоторые найденные документы, не содержащие поля, используемого в критериях сортировки.Не найдено сопоставления для поля для сортировки по ElasticSearch

SearchParseException: Разбираем Failure [Нет отображение найденное [цена] для того, чтобы сортировать по]

Как я могу успешно искать эти документы, даже если некоторые из них отсутствуют в price поле?

+1

Ваш вопрос/ответ решил мою проблему - спасибо. Я отредактировал его, чтобы обобщить его, не стесняясь откат, если это вас не устраивает. –

+0

Ссылка для обработки этой проблемы [ссылка на Elasticsearch] (https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-sort.html) – Ajeesh

ответ

78

После того, как выкопали больше, я нашел решение, как показано ниже. ignore_unmapped должно быть явно установлено в true в предложении sort.

"sort" : [ 
     { "rating": {"order" : "desc" , "ignore_unmapped" : true} }, 
     { "price": {"order" : "asc" , "missing" : "_last" , "ignore_unmapped" : true} } 
] 

Для получения дополнительной информации посмотрите на ссылки Elasticsearch для:

+0

Привет, у меня такая же проблема, и я не знаю Не понимаю, как это работает ... Отсутствующие атрибуты и ignore_unmapped должны работать вместе правильно? Если, например, я не укажу на «_last» и ignore_unmapped на «false», у меня все еще есть проблема, но я хочу, чтобы документы были в результатах во всех случаях, даже если у них нет атрибута. – c4k

+0

У меня эта проблема, и «ignore_unmapped» не работает, если ваш _type пуст (т. Е. Без индексирования документа). – reinaldoluckman

+2

Похоже, новая стратегия заключается в использовании [unmapped_type] (https://www.elastic.co/guide/en/elasticsearch/reference/1.x/search-request-sort.html#_ignoring_unmapped_fields) – lukmdo

0

я испытал ту же проблему (Сорта, хотел бы получить некоторые ошибки, но некоторые результаты), но в моем случае мой поиск выдавался в корне (индекс не указан), и ошибки, которые я получал, были связаны с тем, что море rch/order также смотрел на индекс Кибаны.

Глупая ошибка, но, возможно, это поможет кому-то еще, кто попадает сюда.

+0

У меня такая же проблема .. но когда я укажу игнорировать unmapped, я не получаю никакой сортировки вообще при поиске в корне ... это ограничивает возможность поиска для меня, если я должен определить индекс ... я бы просто хочу, чтобы все результаты сопоставления были отсортированы по полю, если он существует, и заполните значение по умолчанию для тех, которые не ... EDIT: – mgoetzke

2

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

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

У меня была эта ошибка с Rails + ElasticSearch + Tire, потому что столбец сортировки не имел значения по умолчанию, поэтому его отправляли в ES как null.

This issue указывает, что нулевые значения обрабатываются, но это был не мой опыт. Это все равно стоит попробовать.

28

Для тех, кто ищет пример обоих ignore_unmapped и unmapped_type пожалуйста, см my response here.

Обратите внимание, что «ignore_unmapped» теперь устарел в пользу «unmapped_type». Это было сделано в рамках #7039

From documentation: Перед 1.4.0 там был ignore_unmapped логический параметр, который не был достаточно информации, чтобы принять решение о значениях сортировки испускать, и не работает для поиска кросс-индекса. Он по-прежнему поддерживается, но пользователям рекомендуется перейти на новый unmapped_type.

По умолчанию запрос поиска не будет выполнен, если нет сопоставления, связанного с полем. Опция unmapped_type позволяет игнорировать поля, которые не имеют сопоставления, а не сортируются по ним. Значение этого параметра используется для определения значений сортировки для испускания.Вот пример того, как он может быть использован:

{ 
    "sort" : [ 
     { "price" : {"unmapped_type" : "long"} }, 
    ], 
    "query" : { 
     "term" : { "user" : "kimchy" } 
    } 
} 

Если какие-либо из индексов, которые запрошены не имеет отображения для цены, тем Elasticsearch будет обрабатывать его, как если бы там было отображение типа длинного, с все документы в этом индексе не имеют значения для этого поля.

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