这是 Lucene 评分公式:
score(q,d) = coord(q,d) · queryNorm(q) · ∑ ( tf(t in d) · idf(t)2 · t.getBoost() · norm(t,d))
多场得分呢?
分数是直接求和或平均还是..?
这是 Lucene 评分公式:
score(q,d) = coord(q,d) · queryNorm(q) · ∑ ( tf(t in d) · idf(t)2 · t.getBoost() · norm(t,d))
多场得分呢?
分数是直接求和或平均还是..?
您可以在相似度类中阅读评分的详细信息。在此等式中,当参数实际表示字段时,参考文档引用参数。因此,术语频率是文档中给定字段中术语的频率。这会自动处理多个字段的查询。
KenE 上面的回答是不正确的。(等式中没有 MAX 运算符。)字段上每个查询的分数加起来就是最终分数。对于查询 (name:bill OR gender:male),结果是 (name:bill) 和 (gender:male) 的得分之和。通常,同时满足这两个标准的文档将得分更高(由于总和)并出现。
这取决于操作。如果您正在执行 OR (姓名:比尔 OR 性别:男性),则需要两者中的最大值。如果你在做一个 AND,它会做一个总和。
Shashikant Kore 正确地说每个字段的分数是相加的。然而,这仅在queryNorm
和coord
因素的贡献之前是正确的,这意味着最终分数不太可能相加。
每个分数都乘以queryNorm
因子,该因子是按查询计算的,因此对于 、 和 中的每一个(name:bill)
都(gender:male)
不同(name:bill OR gender:male)
。queryNorm
组合查询的s也不仅仅是queryNorm
两个单项查询的 s 之和。因此,仅当您将每个分数除以queryNorm
该查询的因子时,分数才会相加。
该coord
因素也可能支付一部分:默认计分器将分数乘以匹配的查询词的比例。因此,您只能在考虑queryNorm
所有术语匹配(或coord
禁用)的位置之后依赖求和。
explain
您可以使用Solr 中通过debugQuery=true
参数提供的功能准确查看分数是如何计算的。
使用 lucene 的默认相似度得分,我使用了一个布尔查询并得到了最终公式如下:(对不起,它在latex
)
score(q, d) = \sum_{f \in fields} \sum_{t \in query} idf(t, f) queryNorm(query) \times idf(t, f) tf(t, d, f) fieldNorm(f)