【问题标题】:why does elasticsearch calculates score for term queries?为什么 elasticsearch 计算术语查询的分数?
【发布时间】:2020-06-14 18:31:06
【问题描述】:

我想根据使用术语查询的唯一字段值进行简单查询。例如:

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

关于term queries,Elasticsearch 文档指出:

返回在提供的字段中包含确切术语的文档。 您可以使用术语查询根据价格、产品 ID 或用户名等精确值查找文档。

另一方面,文档还建议 _score 是针对相关性很重要的查询计算的(而不是涉及精确匹配的过滤器上下文的情况)。

我觉得有点混乱。为什么 Elasticsearch 为应该关注精确匹配而不是相关性的术语查询计算_score

【问题讨论】:

    标签: elasticsearch elasticsearch-query term-query


    【解决方案1】:

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

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

    更多关于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"
                    }
                }
            ]
    

    【讨论】:

    • 如何用filter子句制定must子句?
    • @Nag 你可以在这里发布一个包含所有细节的新问题并发表评论
    【解决方案2】:

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

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

    上述查询不会计算分数。

    【讨论】:

    • @OpsterElasticsearchNinja 比抱歉更安全......因为你的答案也和我的一样;-)
    • 是的,我们都在完全相同的时间(见时间戳)给出了答案,并做了更多解释,我想知道为什么用户 @Nag 评论了同一个链接。
    • 很公平......也许@Nag 没有首先打开它?
    • @Val,正是我的意思,也许你比我有更多的声誉:wink:p
    • @Opster Elasticsearch Ninja,抱歉 - 我不知何故错过了您的答案,直接从谷歌结果中查看 Val 的答案,我将其删除。
    猜你喜欢
    • 2021-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-13
    • 2016-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多