Lucene定制相似/得分

时间:2015-11-01 20:24:38

标签: elasticsearch lucene similarity tf-idf

我正在寻找Lucene(Java)中的相似性模块,该模块给出了基于权重的分数。我知道这很模糊,最好用一个例子来解释。

Document 1
-----------
Firstname: Francesca

Document 2
-----------
Firstname: Francisco

使用Doublemetaphone& amp; amp; amp; amp;精制Soundex语音算法。在索引阶段。

因此,倒排索引看起来像这样(最后两个术语分别由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并覆盖必要的方法。但是调用相似性模块的模块在哪里并且总结了每个文档的所有分数?我问的原因是我也会根据其他领域的分数来扩展这个权重,在这种情况下,每个文档的总分将是各个领域的加权平均值之和。因此,我还应该自定义代码来总结各个字段的分数并覆盖它以找到平均值。有人能指出一些指示吗?感谢。

1 个答案:

答案 0 :(得分:1)

开始这个的好地方是JörgPrante项目 - https://github.com/jprante/elasticsearch-payload

除了其他项目,他还扩展了相似性模块。

关于实施,我建议您查看令牌的类型字段或有效负载字段以推断得分。

在以下文件中 - 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);
}