嵌套关键字字段上的 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.keydurationmetas.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 之间。