为什么 elasticsearch 计算术语查询的分数?

why does elasticsearch calculates score for term queries?

我想基于使用术语查询了解唯一字段值来进行简单查询。例如:

{
  "query": {
    "term": {
      "products.product_id": {
        "value": "Ubsdf-234kjasdf"
      }
    }
  }
}

关于 term queries,Elasticsearch 文档指出:

Returns documents that contain an exact term in a provided field. You can use the term query to find documents based on a precise value such as a price, a product ID, or a username.

另一方面,文档还表明 _score 是针对相关性很重要的查询计算的(对于涉及 完全匹配 的过滤器上下文则不是这种情况) ).

我觉得有点混乱。为什么 Elasticsearch 为本应与 完全匹配 而不是相关性有关的术语查询计算 _score

Filter context 意味着您需要将术语查询包装在 bool/filter 查询中,如下所示:

{
  "query": {
    "bool": {
      "filter": {
        "term": {
          "products.product_id": {
            "value": "Ubsdf-234kjasdf"
          }
        }
      }
    }
  }
}

以上查询不会计算分数。

不分析术语查询,因此它们不会进入分析阶段,因此用于精确匹配,但在查询上下文中使用时仍会计算它们的分数

当您在过滤器上下文中使用术语查询时,这意味着您不是在搜索它们,而是在过滤它们,因此没有为它们计算分数。

有关 query and filter context in official ES doc 的更多信息。

我下面的示例中显示的过滤器和查询上下文中的术语查询示例

查询上下文中的术语查询

{
    "query": {
        "bool": {
            "must": [
                {
                    "term": {
                        "title": "c"
                    }
                }
            ]
        }
    },
    "size": 10
}

结果得分

"hits": [
            {
                "_index": "cpp",
                "_type": "_doc",
                "_id": "4",
                "_score": 0.2876821, --> notice score is calculated
                "_source": {
                    "title": "c"
                }
            }
        ]

过滤器上下文中的术语查询

{
    "query": {
        "bool": {
            "filter": [ --> prev cluase replaced by `filter`
                {
                    "term": {
                        "title": "c"
                    }
                }
            ]
        }
    },
    "size": 10
}

以及带过滤上下文的搜索结果

 "hits": [
            {
                "_index": "cpp",
                "_type": "_doc",
                "_id": "4",
                "_score": 0.0, --> notice score is 0.
                "_source": {
                    "title": "c"
                }
            }
        ]