禁用Elasticsearch中的IDF得分

13

我正在使用ES进行模糊搜索大量人名列表。

对于评分,TF是适用的,但在这种情况下,IDF并不需要。这会使得分数变得稀释。我仍然希望将TF和字段归一化应用于得分。

我怎样能够禁用/抑制我的查询中的IDF,但保留TF和字段归一化呢?

我看到了Disable IDF calculation 的讨论,但没有帮助到我。在这种情况下似乎也无法使用constant score query


你可能需要编写一个类似于这个的自定义相似度插件(http://stackoverflow.com/questions/32725263/when-rewriting-multiterm-query-add-constant-score-to-every-term-not-to-the-who),来实现多词查询中每个词都添加常数分的功能。 - keety
我尝试过了,但是 public float idf(long docFreq, long numDocs) { 从未被调用。在搜索和索引期间,我已经在我的索引设置中提供了自定义类。 - user1189332
我的映射JSON片段如下: "City_ng": { "type": "string", "analyzer": "n-gram-analyser", "similarity": "my_similarity" } 我的设置JSON片段(直接在根级别)如下: "my_similarity": { "index": { "type": "com.concorde.extensions.score.IDFIgnoredSimilarityProvider" }, "search": { "type": "com.concorde.extensions.score.IDFIgnoredSimilarityProvider" } } Elasticsearch版本为1.7.3 - user1189332
1
这个解决了问题: https://groups.google.com/forum/#!msg/elasticsearch/TAXsDi8JKbs/vIDVinDzckIJ - user1189332
2
很好,也许你应该更新答案并提供步骤,这将有助于未来的其他人。 - keety
显示剩余3条评论
1个回答

10

当创建索引时,我们可以将自己的相似度计算方法放入设置部分。如果您只需要禁用IDF并使用其他内容作为默认设置,您可以编写一个简单的脚本,例如:

在创建索引时,可以将自定义的相似度计算方法加入设置部分。若想仅禁用IDF并使用其他默认设置,可编写类似以下的简单脚本:

"script": {"source": "double tf = Math.sqrt(doc.freq); double idf = 1.0; double norm = 1/Math.sqrt(doc.length); return query.boost * tf * idf * norm;"`}

这里展示了此处


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接