Не найдено сопоставление для поля для сортировки в ElasticSearch


Elasticsearch бросает SearchParseException при разборе запроса, если найдены некоторые документы, не содержащие поля, используемые в критериях сортировки.

SearchParseException: ошибка разбора [не найдено сопоставление для [цена] для сортировки на]

Как я могу успешно искать эти документы, даже если некоторые из них отсутствуют price поле?

5 77

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" }
    }
  ]
}