我正在寻找Lucene(Java)中的相似性模块,该模块给出基于权重的分数。我知道这是模糊的,最好用一个例子来解释。
Document 1
-----------
Firstname: Francesca
Document 2
-----------
Firstname: Francisco
使用Doublemetaphone和精致的Soundex语音算法分析Firstname字段。在索引阶段。
因此,倒排索引看起来像这样(后两个术语分别由Doublemetaphone和REfined Soundex给出):
francesca ===> Doc1
francisco ===> Doc2
FRNS ===> Doc1, Doc2
F29083030 ===> Doc1
F2908306 ===> Doc2
现在,我的搜索查询如下所示:
名:“francesca”
显然,对于Doc1,所有4个术语都匹配。对于每场比赛,我希望给出25%的百分比(我事先知道,给定字词最多只能有4个扩展字词。
按照这个原则,我想给出以下分数:
Doc1 (100) [Reason: All 4 terms match]
Doc2 (25) [Reason: Only FRNS term matches, rest don't match]
现在我的问题是,要实现这一目标,是否有现成的相似模块可用?如果没有,我相信我应该扩展DefaultSimilarity并覆盖必要的方法。但是,调用相似性模块并对每个文档的所有分数求和的模块在哪里?我要问的原因是,我也会将此基于权重的评分扩展到其他字段,在这种情况下,每个文档的总分将是各个字段的加权平均值之和。因此,我还应该自定义汇总各个字段得分的代码,并将其覆盖以找到平均值。有人可以显示一些指针吗?谢谢。
最佳答案
一个好的起点是JörgPrante项目-https://github.com/jprante/elasticsearch-payload
除了其他项目,他还扩展了相似性模块。
在实现上,我建议您查看 token 的类型字段或有效负载字段以推断分数。
在以下文件中-https://github.com/jprante/elasticsearch-payload/blob/master/src/main/java/org/xbib/elasticsearch/plugin/payload/PayloadPlugin.java
您可以查看以下有关如何添加相似性模块的代码示例。
public void onModule(SimilarityModule module) {
module.addSimilarity("payload_similarity", PayloadSimilarityProvider.class);
}