使用lucene中的许多独特术语来惩罚文档

时间:2012-12-12 17:04:07

标签: lucene similarity term

我的目的是找到一个城市(术语)的动物(doc)

我用这种方式索引文档:

doc1(bear)  = [city1, city2, city2, city3..]
doc2(dog)   = [city1, city1, city1, city2, city2, city2, city3, city3, city3..]
..

我想对许多城市中出现的(动物)文件进行处罚,因此不同城市/所有城市的文件比例都很高,比如“狗”。

有什么建议吗?感谢

1 个答案:

答案 0 :(得分:2)

已经有了!

请参阅Similarity.computeNorm

默认情况下,norm函数将较短字段的匹配视为更精确的匹配,因此将它们的分数高于较长的字段。

如果您需要更大的影响,可以使用自定义版本覆盖DefaultSimilarity,并修改computeNorm方法返回的值,以更加重视计算的lengthNorm部分。我建议只在现有算法的某个地方添加一个乘数,如果你需要这样做,但是你需要调整它。

请注意!如API中所述,此值存储在索引中,而不是在查询时计算。您必须重新索引才能看到更改生效。


computeNorm(3.6.0)中的计算是:

state.getBoost() * ((float) (1.0 / Math.sqrt(numTerms)))

其中numterms是字段中的术语总数,状态为FieldInvertState