Не найдено сопоставление для поля для сортировки в 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"
    }
}