当我希望精确匹配排名高于"部分"时,应该使用哪些分析器进行索引和搜索。比赛?可能在Similarity
班级设置自定义评分?
例如,当我的索引包含car parts
,car
和car shop
(在lucene 3.5上使用StandardAnalyzer
索引)时,"car"
的查询结果:
(基本上按照添加顺序返回,因为它们都得到相同的分数。)
我希望看到的是car
排名第一,然后是其他结果(对于哪个顺序并不重要,我认为分析师可以对此产生影响)。
答案 0 :(得分:2)
所有三场比赛都是完全(赛车匹配,而不是'ca'或'ar'):)
如果这些字段中没有更多内容(“汽车部件”,“汽车”和“汽车商店”),那么您可以使用lengthNorm()
或computeNorm()
(取决于Lucene版本),给较短的场地更多的重量,以便汽车得到更高的得分,因为更短。在Lucene 3.3.0中,DefaultSimilarity.computeNorm()看起来像这样:
return state.getBoost() * ((float) (1.0 / Math.sqrt(numTerms)));
其中numTerms
是字段中的术语总数。因此,令人惊讶的“汽车”和“汽车商店”文件具有相同的分数,因为“汽车”的标准是1,而“汽车商店”它应该是0.7(假设增加1)。
答案 1 :(得分:0)
快速入侵:从ScoreDoc[]
获取IndexSearcher.search
后,将score
重新排序为第一个标准,将长度(升序)重新排序为第二个标准。