惩罚在lucene中具有许多独特术语的文档

惩罚在lucene中具有许多独特术语的文档,lucene,similarity,term,Lucene,Similarity,Term,我的目的是找到给定城市(术语)的动物(doc) 我以这种方式为文档编制索引: doc1(bear) = [city1, city2, city2, city3..] doc2(dog) = [city1, city1, city1, city2, city2, city2, city3, city3, city3..] .. 我想惩罚出现在很多城市的(动物)文档,因此不同城市/所有城市的文档比例都很高,比如“狗” 有什么建议吗?谢谢已经有了 看 默认情况下,norm函数将较短字段上的匹配

我的目的是找到给定城市(术语)的动物(doc)

我以这种方式为文档编制索引:

doc1(bear)  = [city1, city2, city2, city3..]
doc2(dog)   = [city1, city1, city1, city2, city2, city2, city3, city3, city3..]
..
我想惩罚出现在很多城市的(动物)文档,因此不同城市/所有城市的文档比例都很高,比如“狗”

有什么建议吗?谢谢

已经有了

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

如果需要更大的影响,可以使用自定义版本覆盖DefaultSimilarity,并修改computeNorm方法返回的值,以更重地权衡计算的lengthNorm部分。如果需要的话,我建议只在现有算法的某个地方添加一个乘法器,但可以根据需要进行调整

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


computeNorm(3.6.0)中的计算为:


其中numterms是该领域的术语总数,state是a。

感谢您的快速回复,问题是我只想处罚“峰值”文档,即在许多城市中常见的动物,我不想饲养非常稀有的动物。这是因为非常稀有的动物通常有一个非常低的周期频率,并且仅仅因为它们通常有一个较低的场常模而得到增强。我需要用高频来检索动物(只切断真正普通的动物)。好吧,这确实有点复杂,需要你定义“峰值”是什么。但答案仍然是一样的。在自定义相似度中实现您的逻辑,扩展DefaultSimilarity,使用满足您需求的ComputeForm实现,然后使用它重新编制索引。好的,谢谢。。你能发布一些关于如何做的粗略的示例代码吗?我在考虑使用条件概率和boost,以及没有字段规范的索引。即,将连接到dog的唯一城市(术语)的数量除以唯一城市的总数。而不是使用概率因子的倒数来提升文档。例如,doc*boost 1/Pfactor[P(狗城市)/P(城市)]。我可以计算lucene的条件概率。这种方法有意义吗?除了DefaultSimilatiry子类的框架之外,我不知道我能提供什么。我将复制DefaultSimilarity.computeNorm()中的源代码,至少从如何从FieldInvertState提取相关数据开始。至于你的条件概率算法是否合理,我真的无法回答。似乎有道理,但我不知道你的要求。
state.getBoost() * ((float) (1.0 / Math.sqrt(numTerms)))