嵌套关键字字段上的 Elasticsearch 范围查询
Elasticsearch Range Query on Nested Keyword field
我正在尝试 运行 在 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
正如 Nishant 在评论中提到的,您需要将类型更改为 numeric datatype。
The Range Query documentation 状态:
Matches documents with fields that have terms within a certain range.
The type of the Lucene query depends on the field type, for string
fields, the TermRangeQuery
, while for number/date fields, the query is
a NumericRangeQuery
.
因此,当您有一个 keyword
(这是一个 string
类型)时,Elasticsearch 使用 TermRangeQuery
进行比较,并采用字母顺序。按字母顺序,20 介于 100 和 200 之间。
我正在尝试 运行 在 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
正如 Nishant 在评论中提到的,您需要将类型更改为 numeric datatype。
The Range Query documentation 状态:
Matches documents with fields that have terms within a certain range. The type of the Lucene query depends on the field type, for
string
fields, theTermRangeQuery
, while for number/date fields, the query is aNumericRangeQuery
.
因此,当您有一个 keyword
(这是一个 string
类型)时,Elasticsearch 使用 TermRangeQuery
进行比较,并采用字母顺序。按字母顺序,20 介于 100 和 200 之间。