Elasticsearch Range Query в поле «Вложенное ключевое слово» - PullRequest
0 голосов
/ 31 января 2019

Я пытаюсь выполнить запрос диапазона для вложенного ключевого поля в 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 Ответ

0 голосов
/ 01 февраля 2019

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...