Не найдено сопоставление для поля для сортировки в 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, который был недостаточно информативен для принятия решения о сортировке значений для испускания и не работал для кросс-индекса поиск. Он по-прежнему поддерживается, но пользователям рекомендуется перейти на новый unmapped_type вместо этого.
по умолчанию поисковый запрос завершается ошибкой, если с полем не связано сопоставление. Опция unmapped_type позволяет игнорировать поля, которые не имеют сопоставления и не сортируются по ним. Значение этого параметра используется для определения того, какие значения излучать. Вот пример того, как его можно использовать:
{ "sort" : [ { "price" : {"unmapped_type" : "long"} }, ], "query" : { "term" : { "user" : "kimchy" } } }
если какой-либо из индексов, которые запрашиваются не имеет сопоставление для цены тогда Elasticsearch будет обрабатывать его, как если бы было сопоставление типа long, причем все документы в этом индексе не имеют значения для этого поля.
видимо ElasticSearch не будет сортировать по нулевым значениям. Я предполагал, что он будет рассматривать null как находящийся в начале или конце (как при заказе SQL), но я считаю, что он также вызывает эту ошибку.
поэтому, если вы видите эту ошибку, вам может потребоваться убедиться, что атрибут сортировки имеет значение по умолчанию, когда он отправляется в 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" } } ] }