2014-09-23 45 views
0

我在用3个字段(“名称”,“地址”和“全名”)搜索索引,并使用DisjunctionMaxQuery以3个字段的最高分对结果进行排名。当点击数相同时,lucene按doc ID排列它们(低doc ID将是第一个)。如何在Lucene中使用DisjunctionMaxQuery时按相同分数的特定字段进行排名?

但我不想按照doc ID排名。我想按字段排名。如果命中的分数相同,我预计其分数(最高分)来自“名称”字段的命中将在其分数来自其他字段的命中之前。

我觉得客户收集器& HitQueue是个好主意,重写PriorityQueue.lessThan方法可以改变优先级队列中的排名。不幸的是,ScoreDoc中的信息太少,很难为每次击中获得最高分数的来源。

其他人知道如何解决它?

回答

0

这种最简单的方法是简单地提高你要来首次以平局比其他稍微领域:

Query query = new DisjunctionMaxQuery(0); 

Query subQueryOne = new TermQuery(new Term("one", searchterm)) 
subQueryOne.setBoost(1.2); 

Query subQueryTwo = new TermQuery(new Term("two", searchterm)) 
subQueryOne.setBoost(1.1); 

Query subQueryThree = new TermQuery(new Term("three", searchterm)) 
subQueryOne.setBoost(1.0); 

query.add(subQueryOne); 
query.add(subQueryTwo); 
query.add(SubQueryThree); 
+0

感谢您的答复。 setBoost通常是一个好方法。它会解决问题。但它也会带来一个新问题,将会改变这些领域的得分。我无法确定它会影响我们的搜索体验。 – 2014-09-23 16:21:18

+0

当然可以。您只需将增加的差异足够小。 – femtoRgon 2014-09-23 16:23:53

+0

我希望这些领域在得分时具有相同的权重(助推)。我认为评分的唯一因素是查询和文档的文本相关性。 – 2014-09-23 16:24:25

相关问题