Elasticsearch 应该在不计算相关性(_score)的情况下进行查询

Elasticsearch should query without computing relevance (_score)

我正在创建对两个字段进行操作的过滤查询。我想避免通过 Elasticsearch 计算相关性。如何在不移动到查询上下文的情况下实现 OR 语句。

我的简化模型有两个布尔字段:

{
   is_opened,
   is_send
}

我想用逻辑准备查询:

(is_opened == true AND is_send == true) OR (is_opened == false) 

换句话说,我想排除具有以下字段的文档:

is_opened == true AND is_send == false

我的查询是这样的:

GET documents/default/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "bool":{
            "must":[
                {"term": {"is_opened":true}},
                {"term": {"is_send":true}}
              ]
          }
        },
        {
          "bool":{
            "must":[
                {"term": {"is_opened":false}}
              ]
          }
        }
      ]
    }
  }
}

逻辑上它按我的预期工作,但 Elasticsearch 计算 相关性。 我不需要它,因为最后我按另一个字段对结果进行排序,所以它是优化查询的地方。 我问这个是因为 Frequently used filters will be cached automatically by Elasticsearch, to speed up performance.

我的结果计算了 _score 字段,所以我认为上面的查询是在查询上下文中执行的,因此 Elasticsearch 不会自动缓存它。

将来我想创建在 status 字段上运行的查询,其中的逻辑会更复杂。我仍然需要知道如何阻止计算 _score.

我注意到将 should 更改为 filter 块计算 _score 但作为 必须运算符。是否可以更改 filter 行为?

是否可以使用其他查询? 如何强制 Elasticserach 停止计算 _score?

只需将您的查询包装在 constant_score query:

GET documents/default/_search
{
  "query": {
    "constant_score": {
      "filter": {
        "bool": {
          "should": [
            {
              "bool": {
                "must": [
                  {
                    "term": {
                      "is_opened": true
                    }
                  },
                  {
                    "term": {
                      "is_send": true
                    }
                  }
                ]
              }
            },
            {
              "bool": {
                "must": [
                  {
                    "term": {
                      "is_opened": false
                    }
                  }
                ]
              }
            }
          ]
        }
      }
    }
  }
}