我正在寻找的是关于 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 找到的每个文档的分数吗?最终,如何改变这种评分机制?