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}}"
}
}
}
}
}
}
}
请记住,您只能过滤 而不能过滤 个已分析的字段。
我目前对弹性查询的结构感到很困惑。让我用以下适合我的模板来解释我的意思:
{
"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}}"
}
}
}
}
}
}
}
请记住,您只能过滤 而不能过滤 个已分析的字段。