如欲转载,请注明作者:caocao,来源http://blog.youkuaiyun.com/nethermit/,欢迎大家讨论
Lucene的搜索结果默认按相关度排序,这个相关度排序是基于内部的Score和DocID,Score又基于关键词的内部评分和做索引时的boost。默认Score高的排前面,如果Score一样,再按索引顺序,先索引的排前面。那么有人问了,如果我要先索引的排后面怎么办呢?隐士研究了源码后发现这是相当简单的事情。以下代码基于Lucene 2.0。
看Sort的默认构造函数,相关度就是SortField.FIELD_SCORE和SortField.FIELD_DOC的组合。
/** */
/**
* Sorts by computed relevance. This is the same sort criteria as calling
* {@link Searcher#search(Query) Searcher#search()}without a sort criteria,
* only with slightly more overhead.
*/

public
Sort()
...
{
this(new SortField[] ...{ SortField.FIELD_SCORE, SortField.FIELD_DOC });
}
那么该如何构造我们需要的SortField呢?请看SortField的一个构造函数,有一个参数reverse可供我们调整结果集的顺序。
/** */
/** Creates a sort, possibly in reverse, by terms in the given field with the
* type of term values explicitly given.
* @param field Name of field to sort by. Can be <code>null</code> if
* <code>type</code> is SCORE or DOC.
* @param type Type of values in the terms.
* @param reverse True if natural order should be reversed.
*/

public
SortField (String field,
int
type,
boolean
reverse)
...
{
this.field = (field != null) ? field.intern() : field;
this.type = type;
this.reverse = reverse;
}
由此可见,只要构造一个SortField[]就可以实现我们要的功能,请看:
//
评分降序,评分一样时后索引的排前面

new
SortField[]
...
{ SortField.FIELD_SCORE, new SortField(null, SortField.DOC, true) }

//
评分升序,评分一样时后索引的排前面,呵呵,此为最不相关的排前面,挺有趣的

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。
本文介绍如何在Lucene中自定义搜索结果的排序方式,包括按评分降序或升序排列,以及当评分相同时如何根据索引顺序进行排序。通过调整SortField的构造函数参数,可以灵活地改变搜索结果的呈现顺序。
259

被折叠的 条评论
为什么被折叠?



