使用Java API在ElasticSearch中使用JaroWinkler对查询进行评分

时间:2016-02-11 14:58:32

标签: java elasticsearch

我正在使用Java API处理ElasticSearch。

目前,我正在进行一些匹配查询。现在,我想使用字符串的Jaro Winkler距离来计算查询的_score值。

ElasticSearch是否允许使用用户定义的其他评分函数?

2 个答案:

答案 0 :(得分:2)

Elasticsearch在引擎盖下使用lucene进行所有评分。 Lucene在6.0之前的版本中使用TF / IDF进行评分,而在6.0之后的版本使用Bm25算法。

Elasticsearch允许您编写脚本来修改已经从lucene获得的命中的分数,但是没有其他方法可以编写为初始搜索实现的评分函数。由于结果的分页,尝试修改得分也会受到限制,因为与第一页上的所有结果相比,第二页上的结果可能比使用算法的效果更好。

所以你唯一可以做的就是为elasticsearch / lucene写一个插件来做这件事。您还应该记住,elasticsearch / lucene使用倒排索引,因此您的结果可能仍然不是您想要的。

此外,由于无法访问服务器,因此对您的问题的简短回答是不可行的。 你能做的最好的事情就是要求大量的结果,然后使用脚本来提升它们。

编辑:在做了一些更多的研究之后,我发现在{{{{}的帮助下,您可能能够使用弹性搜索的function score查询与您想要做的事情非常类似。 3}}。虽然它仍然不会改变文件的发现方式(必须处理倒置的索引和分析器等),但你肯定会对结果的得分感到困惑。另请查看fuzziness

答案 1 :(得分:2)

Elasticsearch将该算法用于terms suggesters。如果您想要这样的自定义评分,您可能需要为此构建一个插件,如果您无法访问可以安装插件的服务器,则可能很难。或者,如果您有Groovy脚本实现,也许您可​​以在搜索时使用脚本执行此操作。

快速浏览网页:https://github.com/ucidentity/id-match-engine/blob/master/grails-app/services/dolphin/JaroWinklerDistanceService.groovy