首页 > 解决方案 > Elasticsearch:如何在过滤器上下文中编写“OR”子句?

问题描述

我正在寻找与 ES 版本是 6.7 兼容的语法/示例。我看过文档,我没有看到任何例子,而且解释对我来说不够清楚。我已经尝试根据那个编写查询,但我不断收到语法错误。我已经看到了关于 SO 的以下问题,但它们对我没有帮助:

在 bool 查询中过滤 should 的上下文 (Elasticsearch)

它没有任何例子。

Elasticsearch 中的多个 OR 过滤器

我收到语法错误

"type": "parsing_exception",
"reason": "no [query] registered for [filtered]",
"line": 1,
"col": 31

也许它适用于不同版本的 ES。

我所需要的只是一个带有两个“或”条件的简单示例(我的是一个range和一个term,但我想这并不重要),我都希望在过滤器上下文中拥有(我不关心分数,也不关心文本搜索)。

如果您真的需要它,我可以展示我的尝试(需要在发布之前从中删除一些“敏感”(duh)部分),但它们会给出解析/语法错误,所以我认为它们没有任何意义。我知道那些没有表现出任何努力的问题被认为对 SO 不利,但我没有看到任何逻辑来显示甚至没有成功解析的尝试,任何示例都可以帮助我理解语法。

标签: elasticsearchelasticsearch-6

解决方案


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


推荐阅读