嵌套关键字字段上的Elasticsearch范围查询

时间:2019-01-31 13:22:01

标签: elasticsearch elasticsearch-6 elasticsearch-nested

我正在尝试对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.value100-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 个答案:

答案 0 :(得分:1)

正如Nishant在评论中所述,您需要将类型更改为numeric datatype

The Range Query documentation状态:

  

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

因此,当您拥有keyword(这是string类型)时,Elasticsearch使用TermRangeQuery进行比较,并采用字母顺序。按字母顺序,20在100到200之间。