调整Lucene相关度排序的方法

调整Lucene相关度排序的方法

如欲转载,请注明作者:caocao,来源http://blog.csdn.net/nethermit/,欢迎大家讨论

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

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

调整Lucene相关度排序的方法调整Lucene相关度排序的方法/**
调整Lucene相关度排序的方法*Sortsbycomputedrelevance.Thisisthesamesortcriteriaascalling
调整Lucene相关度排序的方法*{
@linkSearcher#search(Query)Searcher#search()}withoutasortcriteria,
调整Lucene相关度排序的方法*onlywithslightlymoreoverhead.
调整Lucene相关度排序的方法
*/

调整Lucene相关度排序的方法调整Lucene相关度排序的方法publicSort(){
调整Lucene相关度排序的方法调整Lucene相关度排序的方法
this(newSortField[]{SortField.FIELD_SCORE,SortField.FIELD_DOC});
调整Lucene相关度排序的方法}

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

调整Lucene相关度排序的方法调整Lucene相关度排序的方法/**Createsasort,possiblyinreverse,bytermsinthegivenfieldwiththe
调整Lucene相关度排序的方法*typeoftermvaluesexplicitlygiven.
调整Lucene相关度排序的方法*
@paramfieldNameoffieldtosortby.Canbe<code>null</code>if
调整Lucene相关度排序的方法*<code>type</code>isSCOREorDOC.
调整Lucene相关度排序的方法*
@paramtypeTypeofvaluesintheterms.
调整Lucene相关度排序的方法*
@paramreverseTrueifnaturalordershouldbereversed.
调整Lucene相关度排序的方法
*/

调整Lucene相关度排序的方法调整Lucene相关度排序的方法publicSortField(Stringfield,inttype,booleanreverse){
调整Lucene相关度排序的方法
this.field=(field!=null)?field.intern():field;
调整Lucene相关度排序的方法
this.type=type;
调整Lucene相关度排序的方法
this.reverse=reverse;
调整Lucene相关度排序的方法}

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

调整Lucene相关度排序的方法//评分降序,评分一样时后索引的排前面
调整Lucene相关度排序的方法调整Lucene相关度排序的方法newSortField[]{SortField.FIELD_SCORE,newSortField(null,SortField.DOC,true)}
调整Lucene相关度排序的方法
调整Lucene相关度排序的方法
//评分升序,评分一样时后索引的排前面,呵呵,此为最不相关的排前面,挺有趣的
调整Lucene相关度排序的方法调整Lucene相关度排序的方法newSortField[]{newSortField(null,SortField.SCORE,true),newSortField(null,SortField.DOC,true)}

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

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