Не найдено сопоставление для поля для сортировки в ElasticSearch
Elasticsearch выбрасывает SearchParseException
при анализе запроса, если есть некоторые найденные документы, не содержащие поля, используемые в критериях сортировки.
SearchParseException: Parse Failure [Нет сопоставления для [цены] для сортировки]
Как я могу успешно выполнить поиск этих документов, даже если некоторые из них не имеют поля price
?
Ответы
Ответ 1
Покопавшись еще, я нашел решение, приведенное ниже. ignore_unmapped
должно быть явно установлено в true
в предложении sort.
"sort" : [
{ "rating": {"order" : "desc" , "ignore_unmapped" : true} },
{ "price": {"order" : "asc" , "missing" : "_last" , "ignore_unmapped" : true} }
]
Для получения дополнительной информации взгляните на ссылки Elasticsearch для:
Ответ 2
Для тех, кто ищет пример как ignore_unmapped
, так и unmapped_type
см. мой ответ здесь.
Обратите внимание, что "ignore_unmapped" теперь устарел в пользу "unmapped_type". Это было сделано как часть # 7039
Из документации: До 1.4.0 существовал логический параметр ignore_unmapped, который был недостаточно информации для определения значений сортировки для испускания, и не работал для поиска по нескольким индексам. Он по-прежнему поддерживается, но пользователям рекомендуется перейти на новый файл unmapped_type.
По умолчанию запрос поиска не будет выполнен, если нет сопоставления с полем. Опция unmapped_type позволяет игнорировать поля, которые не имеют сопоставления, а не сортируются по ним. Значение этого параметра используется для определения значений сортировки для испускания. Вот пример того, как его можно использовать:
{
"sort" : [
{ "price" : {"unmapped_type" : "long"} },
],
"query" : {
"term" : { "user" : "kimchy" }
}
}
Если какой-либо из запрошенных индексов не имеет сопоставления для цены, то Elasticsearch будет обрабатывать его, как если бы было отображение типа long, при этом все документы в этом индексе не имели значения для этого поля.
Ответ 3
По-видимому, ElasticSearch не будет сортировать нулевые значения. Я предполагал, что он будет обрабатывать значение null как находящееся в начале или в конце (как при заказе SQL), но я считаю, что это также вызывает эту ошибку.
Итак, если вы видите эту ошибку, вам может потребоваться убедиться, что атрибут sort имеет значение по умолчанию при отправке в ElasticSearch.
У меня была эта ошибка с Rails + ElasticSearch + Tire, потому что столбец сортировки не имел значения по умолчанию, поэтому его отправляли в ES как null.
Эта проблема указывает, что нулевые значения обрабатываются, но это был не мой опыт. Это все равно стоит попробовать.
Ответ 4
У меня возникла одна и та же проблема (sorta; получал некоторые ошибки, но некоторые результаты), но в моем случае мой поиск выдавался в корне (без индекса), а ошибки, которые я получал, были вызваны тем, что поиск/заказ также смотрел на индекс Кибаны.
Глупая ошибка, но, возможно, это поможет кому-то, кто попадает сюда.
Ответ 5
Elasticsearch 6.4
просто укажите индекс и что это в кибане
ДО
GET /_search
{
"query": {
"exists": {
"field": "document_id"
}
},
"sort": [
{
"document_id": { "order": "asc" },
"created_at": { "order": "desc" }
}
]
}
Ответ 6
если вы используете ES 6,7
Попробуй это
sort : ["title.keyword:desc"]
Ответ 7
Вы также можете использовать скрипт, который дает вам некоторую гибкость:
"sort" : {
"_script" : {
"type" : "number",
"script" : {
"lang": "painless",
"source": "return !doc['price'].empty ? doc['price'].value : 0"
},
"order" : "desc"
}
}