当我希望完全匹配的排名高于“部分”匹配时,应使用哪些分析器进行索引和搜索?是否可以在 Similarity
类中设置自定义评分?
例如,当我的索引由 car parts
、car
和 car shop
组成时(用 StandardAnalyzer
索引) > 在 lucene 3.5 上),对 "car"
的查询结果为:
- 汽车零件
- 汽车
- 汽车店
(基本上按照添加的顺序返回,因为它们都得到相同的分数)。
我希望看到的是 car
排在第一位,然后是其他结果(哪个顺序并不重要,我假设分析器会影响它)。
最佳答案
所有三个匹配项都是完全(匹配的术语是汽车,而不是“ca”或“ar”):)
如果这些字段(“car parts”、“car”和“car shop”)中没有更多内容,则可以使用 lengthNorm()
或 computeNorm()
(取决于 Lucene 版本),给较短的字段更多的权重,以便汽车因更短而获得更高的分数。在 Lucene 3.3.0 中,DefaultSimilarity.computeNorm() 看起来像这样:
return state.getBoost() * ((float) (1.0 / Math.sqrt(numTerms)));
其中 numTerms
是该字段中的术语总数。所以令人惊讶的是,“car”和“car shop”文档具有相同的分数,因为“car”的范数是 1,而“car shop”应该是 0.7(假设 boost 为 1)。
关于java - 将精确匹配排名为最高的最佳 lucene 设置是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8786343/