【发布时间】:2009-04-24 12:57:10
【问题描述】:
这是 Lucene 评分公式:
score(q,d) = coord(q,d) · queryNorm(q) · ∑ ( tf(t in d) · idf(t)2 · t.getBoost() · norm(t,d))
多字段评分呢?
分数是直接求和或平均还是..?
【问题讨论】:
标签: lucene information-retrieval
这是 Lucene 评分公式:
score(q,d) = coord(q,d) · queryNorm(q) · ∑ ( tf(t in d) · idf(t)2 · t.getBoost() · norm(t,d))
多字段评分呢?
分数是直接求和或平均还是..?
【问题讨论】:
标签: lucene information-retrieval
你可以在Similarity课堂阅读评分详情。在这个等式中,当参数实际表示字段时,参考文档引用参数。因此,术语频率是文档中给定字段中术语的频率。这会自动处理多个字段的查询。
KenE 上面的回答是不正确的。 (等式中没有 MAX 运算符。)字段上每个查询的分数加起来就是最终分数。对于查询 (name:bill OR gender:male),结果是 (name:bill) 和 (gender:male) 的得分之和。通常,同时满足这两个标准的文档将得分更高(由于总和)并出现。
【讨论】:
这取决于操作。如果您正在执行 OR (姓名:比尔 OR 性别:男性),则需要两者中的最大值。如果你在做 AND,它会做一个 sum。
【讨论】:
Shashikant Kore 正确地说每个字段的分数是相加的。然而,这仅在 queryNorm 和 coord 因素的贡献之前是正确的,这意味着最终的分数不可能加起来。
每个分数都乘以 queryNorm 因子,该因子是针对每个查询计算的,因此对于 (name:bill)、(gender:male) 和 (name:bill OR gender:male) 中的每一个都不同。组合查询的 queryNorm 也不仅仅是两个单项查询的 queryNorms 的总和。因此,只有将每个分数除以该查询的 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)
【讨论】: