原创作者: caocao   阅读:4514次   评论:5条   更新时间:2011-05-26    

如欲转载,请注明作者:caocao,来源http://caocao.iteye.com/

Lucene的搜索结果默认按相关度排序,这个相关度排序是基于内部的Score和DocID,Score又基于关键词的内部评分和做索引时的boost。默认Score高的排前面,如果Score一样,再按索引顺序,先索引的排前面。那么有人问了,如果我要先索引的排后面怎么办呢?隐士研究了源码后发现这是相当简单的事情。以下代码基于Lucene 2.0。

看Sort的默认构造函数,相关度就是SortField.FIELD_SCORE和SortField.FIELD_DOC的组合。

java 代码
  1. /**  
  2.  * Sorts by computed relevance. This is the same sort criteria as calling  
  3.  * {@link Searcher#search(Query) Searcher#search()}without a sort criteria,  
  4.  * only with slightly more overhead.  
  5.  */  
  6. public Sort() {   
  7.   this(new SortField[] { SortField.FIELD_SCORE, SortField.FIELD_DOC });   
  8. }  

那么该如何构造我们需要的SortField呢?请看SortField的一个构造函数,有一个参数reverse可供我们调整结果集的顺序。

java 代码
  1. /** Creates a sort, possibly in reverse, by terms in the given field with the  
  2.    * type of term values explicitly given.  
  3.    * @param field  Name of field to sort by.  Can be <code>null</code> if  
  4.    *               <code>type</code> is SCORE or DOC.  
  5.    * @param type   Type of values in the terms.  
  6.    * @param reverse True if natural order should be reversed.  
  7.    */  
  8.   public SortField (String field, int type, boolean reverse) {   
  9.     this.field = (field != null) ? field.intern() : field;   
  10.     this.type = type;   
  11.     this.reverse = reverse;   
  12.   }  

由此可见,只要构造一个SortField[]就可以实现我们要的功能,请看:

java 代码
  1. // 评分降序,评分一样时后索引的排前面   
  2. new SortField[] { SortField.FIELD_SCORE, new SortField(null, SortField.DOC, true) }   
  3.   
  4. // 评分升序,评分一样时后索引的排前面,呵呵,此为最不相关的排前面,挺有趣的   
  5. new SortField[] { new SortField(null, SortField.SCORE, true), new SortField(null, SortField.DOC, true) }  

呵呵,只要将此SortField[]作为参数传入Sort的构造函数得到Sort的一个instance,将此instance传入searcher.search(query, sort)即可得到了期望的结果。

具体实例可参考隐士做的搜索站http://so.mdbchina.com

评论 共 5 条 请登录后发表评论
5 楼 zdlhkblty 2011-02-18 16:05
给力
4 楼 gnomewarlock 2008-12-31 15:22
原创作者叫 氧化钙氧化钙 ;)
3 楼 yanshien 2008-12-22 09:41
yager 写道

dddd
qiuxiaoj 写道

[color=red][color=red]而额太热[/color][/color]
  
2 楼 qiuxiaoj 2008-12-15 17:32
[color=brown][color=red][color=red]而额太热[/color][/color][/color]

发表评论

您还没有登录,请您登录后再发表评论

文章信息

Global site tag (gtag.js) - Google Analytics