Elastic(搜索):如何正确构造嵌套查询?

Elastic(search): How to structure nested queries correctly?

我目前对弹性查询的结构感到很困惑。让我用以下适合我的模板来解释我的意思:

{
"template" : {
    "query" : {
        "filtered" : {
            "query" : {
                "bool" : {
                    "must" : [
                        { "match" : {
                            "user"  : "{{param_user}}"
                        } },
                        { "match" : {
                            "session" : "{{param_session}}"
                        } },
                        { "range" : {
                            "date" : {
                                "gte" : "{{param_from}}",
                                "lte" : "{{param_to}}"
                            }
                        } }
                    ]
                }
            }
        }
    }
}
}

好的,所以我想获取特定时间段内用户特定会话的条目。现在,如果您对此 link http://www.elastic.co/guide/en/elasticsearch/guide/current/combining-filters.html 感兴趣,您可以找到以下查询:

{
"query" : {
  "filtered" : { 
     "filter" : {
        "bool" : {
          "should" : [
             { "term" : {"price" : 20}}, 
             { "term" : {"productID" : "XHDK-A-1293-#fJ3"}} 
          ],
          "must_not" : {
             "term" : {"price" : 30} 
          }
       }
     }
  }
}
}

在这个例子中,我们在 "filtered" 之后有 "filter" 关键字。但是,如果我像示例中那样将第二个 "query" 替换为 "filter",我的模板将不再有效。这真的是违反直觉的,我花了很多时间来解决这个问题。 A̶l̶s̶o̶ ̶I̶ ̶d̶o̶n̶'̶t̶ ̶u̶n̶d̶e̶r̶s̶t̶a̶n̶d̶ ̶w̶h̶y̶ ̶w̶e̶ ̶n̶e̶e̶d̶ ̶t̶o̶ ̶p̶u̶t̶ ̶e̶v̶e̶r̶y̶ ̶f̶i̶l̶t̶e̶r̶ ̶i̶n̶ ̶s̶e̶p̶a̶r̶a̶t̶e̶ ̶̶{̶ ̶}̶̶ ̶e̶v̶e̶n̶ ̶t̶h̶o̶u̶g̶h̶ ̶t̶h̶e̶y̶ ̶a̶r̶e̶ ̶a̶l̶r̶e̶a̶d̶y̶ ̶s̶e̶p̶a̶r̶a̶t̶e̶d̶ ̶b̶y̶ ̶t̶h̶e̶ ̶a̶r̶r̶a̶y̶ ̶s̶y̶n̶t̶a̶x̶.̶

我遇到的另一个问题是,我建议匹配几个字段,我只需键入以下内容即可:

{
"query" : {
    "match" : {
        "user"  : "{{param_user}}",
        "session" : "{{param_session}}"
    }
}
}

但似乎我必须使用一个我不知道的 bool 查询,所以我搜索了 'elastic multi match' 但得到了完全不同的东西。

我的问题:在哪里可以找到如何正确构建查询(类似于 PEG)?该文档仅提供基本示例,但未说明我们实际可以做什么以及如何做。

此致, 一月

编辑: 好的,我只是偶然发现我无法将 "query""filter" 交换,因为 "match" 是一个查询,而不是一个筛选。但是话又说回来 "range" 呢?好像是一个query,也是一个filter。。。有没有关键字的总结说明可以在什么上下文中使用?

Is there a summary of keywords specifying in which context they can be used?

我不会将其视为 keywords。只是存在同名的查询和过滤器(但不是全部)。

Here 是您需要的一切。例如,有 range 查询和过滤器。您只需要了解过滤器和查询之间的区别。

例如,如果您想将 range 部分从查询移动到过滤器,您可以按照下面的代码(未测试)所示进行操作。由于您的代码已经包含 filtered 类型的查询,您可以在 query 部分之后创建 filter 部分。

{
    "template": {
        "query": {
            "filtered": {
                "query": {
                    "bool": {
                        "must": [
                            {
                                "match": {
                                    "user": "{{param_user}}"
                                }
                            },
                            {
                                "match": {
                                    "session": "{{param_session}}"
                                }
                            }
                        ]
                    }
                },
                "filter": {
                    "range": {
                        "date": {
                            "gte": "{{param_from}}",
                            "lte": "{{param_to}}"
                        }
                    }
                }
            }
        }
    }
}

请记住,您只能过滤 而不能过滤 个已分析的字段。