代码之家  ›  专栏  ›  技术社区  ›  Andrzej

Elasticsearch应在不计算相关性的情况下进行查询(\u分数)

  •  1
  • Andrzej  · 技术社区  · 7 年前

    我正在创建对两个字段进行操作的过滤查询。我希望通过以下方式避免计算相关性 弹性搜索 . 如何在不移动到查询上下文的情况下实现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}}
                  ]
              }
            }
          ]
        }
      }
    }
    

    从逻辑上讲,它就像我预期的那样工作,但是 弹性搜索 计算 关联 . 我不需要它,因为最后我会按另一个字段对结果进行排序,这样就可以优化查询了。 我问这个是因为 Frequently used filters will be cached automatically by Elasticsearch, to speed up performance.

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

    将来,我想创建在上操作的查询 地位 _得分 .

    我注意到 应该 滤器 块计算 _得分 但作为 必须 行为

    是否可以使用其他查询? 如何强制 停止计算 _得分 ?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Val    7 年前

    只需将查询包装在 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
                        }
                      }
                    ]
                  }
                }
              ]
            }
          }
        }
      }
    }