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

Meh*_*ran 5 nested elasticsearch elasticsearch-query

在我之前的问题中,我fieldsquery_string查询中介绍了它,以及它如何帮助我搜索文档的嵌套字段.

{
  "query": {
    "query_string": {
      "fields": ["*.id","id"],
      "query": "2"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

但它只适用于匹配,如果我想做一些比较怎么办?经过一些阅读和测试,似乎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"
    } ]
}
Run Code Online (Sandbox Code Playgroud)

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

{
    "query": {
        "range" : {
            "date" : {
                "gte" : "2016-08-16T16:00:00.000000",
            },
            "fields": ["date", "*.date"]
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Val*_*Val 3

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

{
  "query": {
    "query_string": {
      "query": "\*date:[2016-08-16T16:00:00.000Z TO *]"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 它位于“查询字符串查询语法”(https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html#_field_names) 文档中的“字段名称”中“ 部分。您根本不需要使用“fields”,通配符使其变得不必要。`\*date` 表示任何以 `date` 结尾的字段(包括嵌套字段)。反斜杠之所以存在,是因为我们需要转义通配符“*”,它是查询字符串语法中的保留字符。 (2认同)