在 Elasticsearch 中,如何在不影响分数的情况下将多个过滤器与 OR 组合?

In Elasticsearch, how do I combine multiple filters with OR without affecting the score?

在 Elasticsearch 中,我想使用 OR 聚合的两个不同子句来过滤我的结果,例如return PropertyA=true 或 PropertyB=true 的文档。

我一直在尝试使用 bool query 来做到这一点。我的基本查询只是 must 中的文本搜索。如果我将这两个子句都放在 filter 出现类型中,它会使用 AND 聚合它们。如果我将两个子句都放在 should 出现类型中并将 minimum_should_match 设置为 1,那么我会得到正确的结果。但是,同时满足这两个条件的文档会获得更高的分数,因为“应该”在查询上下文中运行。

如何过滤仅匹配两个条件之一的文档,而不增加同时匹配两个条件的文档的分数?

提前致谢

您需要利用 constant_score query,所以一切都在过滤器上下文中运行:

{
  "query": {
    "constant_score": {
      "filter": {
        "bool": {
          "minimum_should_match": 1,
          "should": [
            {
              "term": {
                "PropertyA": true
              }
            },
            {
              "term": {
                "PropertyB": true
              }
            }
          ]
        }
      }
    }
  }
}