Не найдено сопоставления для поля для сортировки в ElasticSearch
Elasticsearch бросает SearchParseException
при разборе запроса, если есть некоторые документы, не содержащие поле, используемое в критериях сортировки.
SearchParseException: ошибка разбора [нет сопоставления для [цена] для сортировки]
Как я могу успешно искать эти документы, даже если некоторые из них отсутствуют price
поле?
5 ответов
покопавшись еще, я нашел решение, как указано ниже. ignore_unmapped
должно быть явно задано значение true
в предложении sort.
"sort" : [
{ "rating": {"order" : "desc" , "ignore_unmapped" : true} },
{ "price": {"order" : "asc" , "missing" : "_last" , "ignore_unmapped" : true} }
]
для получения дополнительной информации посмотрите ссылки Elasticsearch для:
для тех, кто ищет пример как
ignore_unmapped
иunmapped_type
см. мой ответ здесь.
обратите внимание, что" ignore_unmapped "теперь устарел в пользу"unmapped_type". Это было сделано в рамках #7039
из документации: до 1.4.0 был параметр ignore_unmapped boolean, который не был достаточной информацией, чтобы решить, какие значения сортировки испускать, и не работал для кросс-индекса поиск. Он по-прежнему поддерживается, но пользователям рекомендуется перейти на новый unmapped_type.
по умолчанию поисковый запрос завершится ошибкой, если нет сопоставления, связанного с полем. Опция unmapped_type позволяет игнорировать поля, которые не имеют сопоставления и не сортируются по ним. Значение этого параметра используется для определения того, какие значения излучать. Вот пример того, как его можно использовать:
{
"sort" : [
{ "price" : {"unmapped_type" : "long"} },
],
"query" : {
"term" : { "user" : "kimchy" }
}
}
если какой-либо из запрашиваемых индексов не имеет сопоставление для цены тогда Elasticsearch будет обрабатывать его, как если бы было сопоставление типа long, при этом все документы в этом индексе не имеют значения для этого поля.
видимо Elasticsearch в не разберешь на нулевые значения. Я предполагал, что он будет рассматривать null как начало или конец (как с порядком SQL), но я считаю, что он также вызывает эту ошибку.
поэтому, если вы видите эту ошибку, вам может потребоваться убедиться, что атрибут sort имеет значение по умолчанию, когда он отправляется ElasticSearch.
У меня была эта ошибка с Rails+ElasticSearch+Tire, потому что столбец сортировки не имел значения по умолчанию, поэтому отправлялся в ES как ноль.
этот вопрос указывает, что значения null обрабатываются, но это не был мой опыт. В любом случае, стоит попробовать.
Я испытал ту же проблему (sorta; получил бы некоторые ошибки, но некоторые результаты), но в моем случае мой поиск выдавался в корне (не указан индекс), и ошибки, которые я получал, были потому, что поиск/заказ также искал индекс Kibana.
глупая ошибка, но, возможно, это поможет кому-то еще, кто окажется здесь.
Elasticsearch 6.4
просто укажите индекс, и это все в Kibana
до
GET /_search
{
"query": {
"exists": {
"field": "document_id"
}
},
"sort": [
{
"document_id": { "order": "asc" },
"created_at": { "order": "desc" }
}
]
}
после
GET /document-index/contact/_search (here)
{
"query": {
"exists": {
"field": "document_id"
}
},
"sort": [
{
"document_id": { "order": "asc" },
"created_at": { "order": "desc" }
}
]
}