如何在Elasticsearch中的同一查询中使用`gt`和`fields`

时间:2016-08-17 03:24:30

标签: elasticsearch nested elasticsearch-query

在我的enter image description here中,我在fields查询中了解了query_string,以及它如何帮助我搜索文档的嵌套字段。

{
  "query": {
    "query_string": {
      "fields": ["*.id","id"],
      "query": "2"
    }
  }
}

但它只适用于匹配,如果我想做一些比较怎么办?经过一些阅读和测试后,似乎range之类的查询不支持fields。我有什么方法可以执行range查询,例如在一个日期上,可以分散在文档层次结构中任何位置的字段?

即。考虑以下文件:

{
    "id" : 1,
    "Comment" : "Comment 1",
    "date" : "2016-08-16T15:22:36.967489",
    "Reply" : [ {
        "id" : 2,
        "Comment" : "Inner comment",
        "date" : "2016-08-16T16:22:36.967489"
    } ]
}

是否存在通过date字段(例如date > '2016-08-16T16:00:00.000000')搜索与给定文档匹配的查询,因为嵌套字段没有明确地将地址提供给Reply.date?像这样的东西(我知道以下查询是不正确的):

{
    "query": {
        "range" : {
            "date" : {
                "gte" : "2016-08-16T16:00:00.000000",
            },
            "fields": ["date", "*.date"]
        }
    }
}

1 个答案:

答案 0 :(得分:3)

range查询本身并不支持它,但是,您可以利用query_string查询(再次)以及您可以使用通配符字段并且它支持范围查询的事实实现你所需要的:

{
  "query": {
    "query_string": {
      "query": "\*date:[2016-08-16T16:00:00.000Z TO *]"
    }
  }
}

上述查询将返回您的文档,因为Reply.date*date匹配