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.