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