7.8.5. 自定义 Lucene 的 Scoring Formula
Lucene 允许用户通过扩展 org.apache.lucene.search.Similarity 来自定义其评分公式。此类中定义的抽象方法与计算文档 d 查询 q 分数的以下公式因素相符:
扩展 org.apache.lucene.search.Similarity,以自定义 Lucene 的评分公式。抽象方法与 用于计算 文档 d 查询分数的公式匹配,如下所示:
*score(q,d) = coord(q,d) · queryNorm(q) · ∑ ~t in q~ ( tf(t in d) ·
idf(t) ^2^ · t.getBoost() · norm(t,d) )*
| factor | 描述 |
|---|---|
| tf(t ind) | 文档(d)中术语(t)的术语频率因素。 |
| idf(t) | 术语的反向文档频率。 |
| coord(q,d) | 根据在指定文档中找到多少查询术语的分数因素。 |
| queryNorm(q) | 用于在查询之间对分数进行可比较的规范化因素。 |
| t.getBoost() | 字段推动. |
| norm(t,d) | 封装几个(索引时间)增高和长度因素。 |
本手册无法更加详细地解释此公式。如需更多信息,请参阅 Similarity 的 Java 文档。
Hibernate Search 提供三种方法来修改 Lucene 的相似性计算:
首先,您可以使用属性 hibernate.search.similarity 指定一个完全指定的类名称来设置默认的相似性。默认值为 org.apache.lucene.search.DefaultSimilarity。
您还可以通过设置相似性属性来覆盖用于特定索引 的相似性
hibernate.search.default.similarity = my.custom.Similarity
最后,您可以使用 @Similarity 注释覆盖类级别上的默认相似性。
@Entity
@Indexed
@Similarity(impl = DummySimilarity.class)
public class Book {
...
}
例如,让我们假设术语在文档中出现的频率并不重要。出现过多个术语的文档的评分应与多次出现的文档相同。在这种情况下,您的自定义方法 tf(float freq)应该返回 1.0。
当两个实体共享相同的索引时,它们必须声明相同的相似实施。同一类层次结构中的类始终共享索引,因此不允许覆盖子类型中的相似性实施。
同样,通过索引设置和类级设置定义相似性(因为它们会发生冲突)也不有意义。此类配置将被拒绝。