Elasticsearch:如何在过滤器上下文中编写“OR”子句?

sho*_* ek 7 elasticsearch elasticsearch-6

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

布尔查询中的 should 过滤上下文(Elasticsearch)

它没有任何例子。

Elasticsearch 中的多个 OR 过滤器

我收到语法错误

"type": "parsing_exception",
"reason": "no [query] registered for [filtered]",
"line": 1,
"col": 31
Run Code Online (Sandbox Code Playgroud)

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

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

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

Pie*_*gel 31

您需要将should查询包装在查询中filter

{  
   "query":{  
      "bool":{  
         "filter":[{  
            "bool":{  
               "should":[  
                  {  // Query 1 },
                  {  // Query 2 }
               ]
            }
         }]
      }
   }
}
Run Code Online (Sandbox Code Playgroud)


0xc*_*0de 10

我有一个类似的场景(甚至是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": {}
}
Run Code Online (Sandbox Code Playgroud)

我在文档中读到minimum_should_match也可以用于强制过滤器上下文。如果此查询不起作用,这可能会对您有所帮助。

  • “minimum_should_match”不会强制过滤器上下文,但它可用于确保至少一个约束为真(这是过滤器上下文中“should”的默认行为)。但是,在过滤器上下文中,将不会计算分数,并且可以缓存结果以加快后续执行速度。 (2认同)