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 }
               ]
            }
         }]
      }
   }
}

我有一个类似的场景(即使是 rangematch 过滤器),还有一个嵌套级别,两个要“或”的条件(如您的情况)和另一个条件与其结果进行逻辑“与”运算。正如@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 也可用于强制过滤上下文。如果此查询不起作用,这可能会对您有所帮助。