0

我正在尝试对 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的文档(格式化为字符串)。我的查询是成功的,但无论它的值如何都包括任何内容,例如,我正在获取值所在的文档等。我的映射(在 Ruby 中)如下所示:durationmetas.value100-200metas.value20

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

1 回答 1

3

正如 Nishant 在评论中提到的,您需要将类型更改为numeric datatype

范围查询文档指出:

匹配具有特定范围内术语的字段的文档。Lucene 查询的类型取决于字段类型,对于string 字段,是TermRangeQuery,而对于数字/日期字段,查询是NumericRangeQuery

因此,当您有一个keyword(这是一种string类型)ElasticsearchTermRangeQuery用于比较时,就会采用字母顺序。按字母顺序,20 介于 100 和 200 之间。

于 2019-02-01T11:53:38.900 回答