Elasticsearch Range Query в поле "Вложенное ключевое слово"

Я пытаюсь выполнить запрос диапазона для вложенного ключевого поля в Elasticsearch 6.4, но мне не повезло:

{
  "query": {
    "bool": {
      "filter": [
        {
          "nested": {
            "path": "metas",
            "query": {
              "bool": {
                "must": [
                  { "term": { "metas.key": "duration"} },
                  { "range": {"metas.value": {"gte": "100", "lte": "200"} } }
                ]
              }
            }
          }
        }
      ]
    }
  }
}

Поэтому я ищу все документы, где metas.key является duration а также metas.value находится между 100-200 (форматируется как строка). Мой запрос успешен, но включает в себя любой metas.value независимо от его значения, я, например, получаю документы, где значение 20 и т. д. Мое отображение (в Ruby) выглядит так:

indexes :metas, type: :nested do
  indexes :key, type: :keyword
  indexes :value, type: :keyword
  indexes :created_at, type: :date
  indexes :updated_at, type: :date
end

1 ответ

Решение

Как упомянул Нишант в комментарии, вам нужно изменить тип на числовой тип данных.

Документация Range Query гласит:

Сопоставляет документы с полями, в которых есть термины в определенном диапазоне. Тип запроса Lucene зависит от типа поля, для string поля, TermRangeQueryв то время как для полей число / дата запрос является NumericRangeQuery,

Итак, когда у вас есть keyword (который является string тип) Elasticsearch использует TermRangeQuery для сравнения и там взят алфавитный порядок. В алфавитном порядке 20 между 100 и 200.

Другие вопросы по тегам