我要寻找的是关于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找到的每个文档的分数吗?最终,如何改变这种评分机制?
默认评分是核心Lucene中的DefaultSimilarity算法,在此处大量记录。您可以通过配置自己的Similarity得分或使用类似custom_score查询的方法自定义得分。
Similarity
custom_score
就查询结果及其排序的有效性而言,显示的前五个结果中的奇数分数变化似乎很小,以至于我不太关心它,但是如果您想了解其原因,则explainapi可以显示你到底是怎么回事。
explain