首页 > 解决方案 > 带有常量分数包装器的 Elasticsearch 布尔查询

问题描述

使用 elasticsearch-7 时,我对 es 复合查询语法感到困惑。

虽然反复阅读 es 文档,但我只是分别找到布尔或常量分数的标准语法。

正如它所阐明的那样,我了解什么是“查询上下文”和什么是“过滤上下文”。但是当将这两种查询类型组合在一个查询中时,我不知道它是什么意思。

让我们看一个例子:

GET /classes_test/_search
{
  "size": "21",
  "query": {
    "constant_score": {
      "filter": {
        "bool": {
          "must": [
            {
              "match": {
                "class_name": "29386556"
              }
            }
          ],
          "should": [
            {
              "term": {
                "master": "7033560"
              }
            },
            {
              "term": {
                "assistant": "7033560"
              }
            },
            {
              "term": {
                "students": "7033560"
              }
            }
          ],
          "minimum_should_match": 1,
          "must_not": [
            {
              "term": {
                "class_id": 0
              }
            }
          ],
          "filter": [
            {
              "term": {
                "class_status": "1"
              }
            }
          ]
        }
      }
    }
  }
}

这个查询可以很好地执行和响应。响应内容中的每个项目都有一个 '_score' 值,值为 1.0。

那么,这是否意味着 sub bool 查询作为一个整体处于过滤器上下文中,尽管它具有“必须”和“应该”?

我还发现布尔查询可以有一个恒定分数子查询。

为什么 es 允许这些语法但没有更多的词可以解释?

标签: elasticsearch

解决方案


如果您使用constant_score查询,您将永远不会得到不同于 1.0 的分数,除非您指定boost参数,在这种情况下分数将匹配这些参数。

如果你需要得分,你显然需要放弃constant_score

在您的情况下,您的match查询class_name不能产生除 1 或 0 以外的任何其他分数,因为这基本上是一个是/否过滤器,而不是基于全文搜索的匹配。

总而言之,您的所有查询都在过滤器上下文中执行(因此得分为 0 或 1),因为您不依赖全文搜索。因此,每当您使用全文搜索时,您都会获得评分,而不是因为您使用match查询。在您的情况下,您可以将所有must约束合并到filter中,这不会有任何区别,因为您只有过滤器(是/否匹配)并且没有全文搜索。


推荐阅读