ElasticSearch 默认评分机制

Posted

技术标签:

【中文标题】ElasticSearch 默认评分机制【英文标题】:ElasticSearch default scoring mechanism 【发布时间】:2013-07-05 12:39:55 【问题描述】:

我正在寻找的是关于 ElasticSearch (Lucene) 的默认评分机制如何真正起作用的简单、清晰的解释。我的意思是,它是使用 Lucene 评分,还是使用自己的评分?

例如,我想通过“名称”字段搜索文档。我使用 .NET NEST 客户端来编写我的查询。让我们考虑这种类型的查询:

IQueryResponse<SomeEntity> queryResult = client.Search<SomeEntity>(s =>
    s.From(0)
   .Size(300)
   .Explain()
   .Query(q => q.Match(a => a.OnField(q.Resolve(f => f.Name)).QueryString("ExampleName")))
);

翻译成这样的 JSON 查询:


 "from": 0,
 "size": 300,
 "explain": true,
 "query": 
   "match": 
     "Name": 
       "query": "ExampleName"
      
    
  

大约有 110 万份文档需要执行搜索。我得到的回报是(这只是结果的一部分,我自己格式化):

650   "ExampleName" 7,313398

651   "ExampleName" 7,313398

652   "ExampleName" 7,313398

653   "ExampleName" 7,239194

654   "ExampleName" 7,239194

860   "ExampleName of Something" 4,5708737  

其中第一个字段只是一个 Id,第二个是 ElasticSearch 执行搜索的名称字段,第三个是分数。

如您所见,ES 索引中有很多重复项。由于一些找到的文档具有不同的分数,尽管它们完全相同(只有不同​​的 ID),我得出的结论是不同的分片对整个数据集的不同部分执行搜索,这导致我追踪分数在某种程度上基于整体给定分片中的数据,而不仅仅是搜索引擎实际考虑的文档。

问题是,这个评分究竟是如何运作的?我的意思是,你能告诉我/告诉我/指出精确的公式来计算 ES 找到的每个文档的分数吗?最终,如何改变这种评分机制?

【问题讨论】:

【参考方案1】:

ElasticSearch 文档中有很好的解释:

什么是相关性: https://www.elastic.co/guide/en/elasticsearch/guide/current/relevance-intro.html

相关性评分背后的理论: https://www.elastic.co/guide/en/elasticsearch/guide/current/scoring-theory.html

【讨论】:

【参考方案2】:

分数变化基于给定分片中的数据(正如您所怀疑的那样)。默认情况下,ES 使用一种称为“query then fetch”的搜索类型,它将查询发送到每个分片,使用本地 TDIF 查找所有具有分数的匹配文档(这将根据给定分片上的数据而有所不同- 这是你的问题)。

您可以通过使用“dfs query then fetch”搜索类型来更改此设置 - 预查询每个分片,询问术语和文档频率,然后向每个分片发送查询等。

你可以在url中设置

$ curl -XGET '/index/type/search?pretty=true&search_type=dfs_query_then_fetch' -d '
  "from": 0,
  "size": 300,
  "explain": true,
  "query": 
    "match": 
      "Name": 
        "query": "ExampleName"
      
    
  
' 

【讨论】:

【参考方案3】:

默认评分是核心 Lucene 中的 DefaultSimilarity 算法,largely documented here。您可以通过配置your own Similarity 或使用custom_score query 之类的东西来自定义评分。

显示的前五个结果中的奇数变化似乎足够小,就查询结果的有效性及其排序而言,我并不关心它,但如果你想了解它的原因, explain api 可以准确地告诉你那里发生了什么。

【讨论】:

好的,这几乎涵盖了我想知道的内容。 ES 纯粹使用 Lucene 的 Similarity 的信息非常有帮助。谢谢! 更多关于 Lucene 评分算法中因素的详细信息:lucenetutorial.com/advanced-topics/scoring.html

以上是关于ElasticSearch 默认评分机制的主要内容,如果未能解决你的问题,请参考以下文章

Elasticsearch实用BM25 -第1部分: shard 如何影响Elasticsearch中的相关性评分

干货 | 一步步拆解 Elasticsearch BM25 模型评分细节

Elasticsearch5.5.1 自定义评分插件开发

Elasticseach的评分机制

lucene 的评分机制

elastic search安全加固手册