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

118

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

SearchParseException: Parse Failure [Не найдено сопоставлений для [цена] для сортировки]

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

Яду
источник
1
Ваш вопрос / ответ решил мою проблему - спасибо. Я отредактировал, чтобы немного обобщить, не стесняйтесь откатывать, если вам это не подходит.
Paul Bellora
1
Ссылка для решения этой проблемы Elasticsearch Link
Аджиш

Ответы:

118

Покопав больше, я нашел решение, приведенное ниже. ignore_unmappedдолжно быть явно указано trueв предложении сортировки.

"sort" : [
       { "rating": {"order" : "desc" , "ignore_unmapped" : true} },
       { "price": {"order" : "asc" , "missing" : "_last" , "ignore_unmapped" : true} }
]

Для получения дополнительной информации см. Ссылки Elasticsearch для:

Яду
источник
Привет, у меня такая же проблема, и я не понимаю, как это работает ... Атрибуты missing и ignore_unmapped должны работать вместе, верно? Если, например, я установил missing на «_last» и ignore_unmapped на «false», у меня все еще есть проблема, но я хочу, чтобы документы присутствовали в результатах во всех случаях, даже если у них нет атрибута.
c4k
У меня эта проблема, и "ignore_unmapped" не работает, если ваш _type пуст (т.е. без индексации какого-либо документа).
reinaldoluckman
7
Выглядит как новая стратегия заключается в использовании unmapped_type
lukmdo
2
Мои запросы всегда работали до сегодняшнего дня без обновления каких-либо библиотек и т.д., но сегодня я начал получать ту же ошибку. Я добавил, "ignore_unmapped" : trueи он снова начал работать, но странно то, что произошло за кулисами! Кто знает! Во всяком случае, теперь это работает. +1
BentCoder
1
Может кто-нибудь прояснить разницу между «отсутствует» и «не отображается»? Для определенного поля, если в некоторых документах оно есть, а в других нет, считается ли такое поле «отсутствующим» или «несопоставленным»? Означает ли «отсутствует» поле в документе, но соответствующее значение равно нулю?
Sher10ck
44

Для тех , кто ищет примера как 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), но я считаю, что он также вызывает эту ошибку.

Поэтому, если вы видите эту ошибку, вам может потребоваться убедиться, что атрибут сортировки имеет значение по умолчанию при отправке в ElasticSearch.

У меня была эта ошибка с Rails + ElasticSearch + Tire, потому что столбец сортировки не имел значения по умолчанию, поэтому он отправлялся в ES как null.

Эта проблема указывает на то, что обрабатываются нулевые значения, но это не было моим опытом. В любом случае это стоит попробовать.

mahemoff
источник
2

У меня возникла та же проблема (вроде бы; были бы некоторые ошибки, но некоторые результаты), но в моем случае мой поиск выполнялся в корне (индекс не указан), и ошибки, которые я получал, были связаны с тем, что поиск / порядок также глядя на индекс Кибаны.

Глупая ошибка, но, может быть, это поможет кому-то другому, кто окажется здесь.

Джеймс Бутчер
источник
У меня такая же проблема ... но когда я указываю игнорировать несопоставленное, я не получаю никакой сортировки при поиске в корне ... это ограничивает возможность поиска меня, если мне нужно определить индекс ... мне просто нужно все совпадающие результаты должны быть отсортированы по полю, если оно существует, и заполнить, использовать значение по умолчанию для тех, которые этого не
делают
2

Elasticsearch 6.4

просто укажите индекс и все в Кибане

ПЕРЕД

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" }
    }
  ]
}
Брайан Санчес
источник
1

если вы используете es 6.7

Попробуй это

sort : ["title.keyword:desc"]
Халид Скиод
источник
Мне помогло - эластик 7.3
мирик 03
0

Вы также можете использовать скрипт, который дает вам некоторую гибкость:

"sort" : {
    "_script" : {
        "type" : "number",
        "script" : {
            "lang": "painless",
            "source": "return !doc['price'].empty ? doc['price'].value : 0"
        },
        "order" : "desc"
    }
}
Рафаль Энден
источник
0

Что происходит, когда мы используем приведенный ниже код, где added_on - это дата !! текст атрибута анализируется, что означает, что он разбивается на отдельные слова при сохранении и позволяет выполнять поиск произвольного текста по одному или нескольким словам в поле

поэтому с полями связаны «текст» и «ключевое слово», поэтому, если нам нужно использовать агрегирование в запросе, нам нужно значение поля, как правило, ключевое слово.

BEFORE

"_source":{....}
"query" : {...}
"sort": [
{
  "added_on": {
    "order": "desc"
  }
}
]

AFTER
"_source":{....}
"query" : {...}
"sort": [
{
  "added_on.keyword": {
    "order": "desc"
  }
}
]
Абхишек
источник