【问题标题】:Elastic(search): How to structure nested queries correctly?弹性(搜索):如何正确构建嵌套查询?
【发布时间】:2015-05-27 21:33:03
【问题描述】:

我目前对弹性查询的结构感到很困惑。让我解释一下我对以下适用于我的模板的含义:

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

好的,所以我想在特定时间段内获取用户特定会话的条目。现在,如果您在此链接 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" 交换,我的模板将不再起作用。这真的很违反直觉,我花了很多时间来解决这个问题。还我不理解为什么我们需要把每个滤在单独̶̶{̶ ̶}̶̶即使它们已经被分离由阵列̶s̶y̶n̶t̶a̶x̶.̶ P>

我遇到的另一个问题是我建议匹配几个字段,我可以只输入 smth 之类的:

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

但似乎我必须使用我不知道的布尔查询,所以我搜索了“弹性多重匹配”但得到了完全不同的东西。

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

最好的问候, 一月

编辑:好吧,我只是偶然发现我无法将"query""filter" 交换,因为"match" 是查询而不是过滤器。但话说回来"range" 呢?它似乎是一个查询和一个过滤器......是否有一个关键字摘要指定它们可以在哪些上下文中使用?

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    是否有关键字摘要说明可以在哪些上下文中使用它们?

    我不认为这是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}}"
                            }
                        }
                    }
                }
            }
        }
    }
    

    请记住,您只能过滤分析的字段。

    【讨论】:

    • 嗯,这更有意义。我不太了解过滤器和查询之间的区别。帮了我很多,但我担心你的链接坏了;)
    • 已修复。只是实际上并没有复制链接:P 无论如何,它只是 Elasticsearch 文档。 ;-) 您可以在那里看到可用的查询和过滤器。一旦你了解了嵌套查询/过滤器的想法,它就会变得超级容易使用。
    • 是的,我明白了。所以这个想法是使用查询来减少获取的文档的大小(仅相关),然后根据用户的需求使用过滤器进一步缩小它们?
    • stackoverflow.com/questions/14595988/queries-vs-filters 这应该会有所帮助。过滤器也可以被认为是类似于 SQL 中的随便的WHERE 子句,而查询是关于全文搜索。
    猜你喜欢
    • 1970-01-01
    • 2021-09-01
    • 2015-09-24
    • 1970-01-01
    • 2017-06-11
    • 2020-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多