Elasticsearch:如何在过滤器上下文中编写 'OR' 子句?
Elasticsearch: How to write an 'OR' clause in filter context?
我正在寻找 syntax/example 与 ES 版本兼容的是 6.7。
我看过文档,我没有看到任何例子,而且解释对我来说不够清楚。我已经尝试根据那个编写查询,但我不断收到语法错误。我已经看到以下关于 SO 的问题,但它们对我没有帮助:
Filter context for should in bool query (Elasticsearch)
它没有任何例子。
Multiple OR filter in Elasticsearch
我收到语法错误
"type": "parsing_exception",
"reason": "no [query] registered for [filtered]",
"line": 1,
"col": 31
可能是针对不同版本的 ES。
我只需要一个简单的例子,有两个“或”条件(我的是一个 range
和一个 term
但我想这应该没什么大不了),我都想要在过滤器上下文中(我不关心分数,也不关心文本搜索)。
如果你真的需要它,我可以展示我的尝试(在发布之前需要从中删除一些 'sensitive'(duh) 部分),但是他们给出 parsing/syntax 错误所以我没有认为它们有任何意义。我知道没有显示任何努力的问题被认为对 SO 不利,但我没有看到显示甚至未成功解析的尝试的任何逻辑,任何示例都可以帮助我理解语法。
您需要将 should
查询包装在 filter
查询中。
{
"query":{
"bool":{
"filter":[{
"bool":{
"should":[
{ // Query 1 },
{ // Query 2 }
]
}
}]
}
}
}
我有一个类似的场景(即使是 range
和 match
过滤器),还有一个嵌套级别,两个要“或”的条件(如您的情况)和另一个条件与其结果进行逻辑“与”运算。正如@Pierre-Nicolas Mougel 在另一个答案中所建议的那样,我嵌套了 bool
子句,在 should
子句周围多了一层。
{
"_source": [
"my_field"
],
"query": {
"bool": {
"filter": {
"bool": {
"must": [
{
"bool": {
"should": [
{
"range": {
"start": {
"gt": "1558878457851",
"lt": "1557998559147"
}
}
},
{
"range": {
"stop": {
"gt": "1558898457851",
"lt": "1558899559147"
}
}
}
]
}
},
{
"match": {
"my_id": "<My_Id>"
}
}
],
"must_not": []
}
}
}
},
"from": 0,
"size": -1,
"sort": [],
"aggs": {}
}
我在文档中读到 minimum_should_match 也可用于强制过滤上下文。如果此查询不起作用,这可能会对您有所帮助。
我正在寻找 syntax/example 与 ES 版本兼容的是 6.7。 我看过文档,我没有看到任何例子,而且解释对我来说不够清楚。我已经尝试根据那个编写查询,但我不断收到语法错误。我已经看到以下关于 SO 的问题,但它们对我没有帮助:
Filter context for should in bool query (Elasticsearch)
它没有任何例子。
Multiple OR filter in Elasticsearch
我收到语法错误
"type": "parsing_exception",
"reason": "no [query] registered for [filtered]",
"line": 1,
"col": 31
可能是针对不同版本的 ES。
我只需要一个简单的例子,有两个“或”条件(我的是一个 range
和一个 term
但我想这应该没什么大不了),我都想要在过滤器上下文中(我不关心分数,也不关心文本搜索)。
如果你真的需要它,我可以展示我的尝试(在发布之前需要从中删除一些 'sensitive'(duh) 部分),但是他们给出 parsing/syntax 错误所以我没有认为它们有任何意义。我知道没有显示任何努力的问题被认为对 SO 不利,但我没有看到显示甚至未成功解析的尝试的任何逻辑,任何示例都可以帮助我理解语法。
您需要将 should
查询包装在 filter
查询中。
{
"query":{
"bool":{
"filter":[{
"bool":{
"should":[
{ // Query 1 },
{ // Query 2 }
]
}
}]
}
}
}
我有一个类似的场景(即使是 range
和 match
过滤器),还有一个嵌套级别,两个要“或”的条件(如您的情况)和另一个条件与其结果进行逻辑“与”运算。正如@Pierre-Nicolas Mougel 在另一个答案中所建议的那样,我嵌套了 bool
子句,在 should
子句周围多了一层。
{
"_source": [
"my_field"
],
"query": {
"bool": {
"filter": {
"bool": {
"must": [
{
"bool": {
"should": [
{
"range": {
"start": {
"gt": "1558878457851",
"lt": "1557998559147"
}
}
},
{
"range": {
"stop": {
"gt": "1558898457851",
"lt": "1558899559147"
}
}
}
]
}
},
{
"match": {
"my_id": "<My_Id>"
}
}
],
"must_not": []
}
}
}
},
"from": 0,
"size": -1,
"sort": [],
"aggs": {}
}
我在文档中读到 minimum_should_match 也可用于强制过滤上下文。如果此查询不起作用,这可能会对您有所帮助。