我正在尝试对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
答案 0 :(得分:1)
正如Nishant在评论中所述,您需要将类型更改为numeric datatype。
The Range Query documentation状态:
匹配具有术语在一定范围内的字段的文档。 Lucene查询的类型取决于字段类型,例如
string
字段TermRangeQuery
,而对于数字/日期字段,查询为NumericRangeQuery
。
因此,当您拥有keyword
(这是string
类型)时,Elasticsearch使用TermRangeQuery
进行比较,并采用字母顺序。按字母顺序,20在100到200之间。