lucene-对搜索结果进行排序
1、在IndexSearcher类中包含了几个可重载的search方法,有一个对结果进行排序的search方法声明为
search(Query,Sort)
public classSortingExample{
private Directory directory;
public SortingExample(Directory direcotry){
this.directory=directory;
}
public void displayHits(Query query,Sort sort) throwsIOException{
IndexSearcher searcher=new IndexSearcher(directory);
Hitshits=searcher.search(query,sort);
System.out.println(StringUtils.rightPad("Title",30))+
StringUtils.rightPad("pubmonth",10)+
StringUtils.center("id",4)+StringUtils.center("score",15));
}
DecimalFormat scoreFormatter=new DeciamalFormat("0.#####");
for (int i=0;i<hits.length();i++){
Document doc=hits.doc(i);
System.out.println(StringUtils.rightPad(
StringUtils.abbreviae(doc.get("title"),29),30)+
StringUtils.rightPad(doc.get("pubmonth"),10)+
StringUtils.center(""+hits.id(i),4)+
StringUtils.leftPad(scoreFormatter.format(hits.score(i)),12)
);
System.out.println(""+doc.get("category"));
}
searcher.close();
}}
2、使用搜索排序
StringindexDir=System.getProperty("index.dir");
FSDirectorydirectory=FSDirectory.getDirectory(indexDir,false);
SortingExample example=new SortingExample(directory);
3、按相关性进行排序(降序),以下三个语句通过displayHits调用了searcher.search,实际效果一样,后2个语句还要另外创建一个Sort对象
example.displayHits(allBooks,null);
example.displayHits(allBooks,Sort.RELEVANCE);
example.displayHits(allBooks,new Sort());
4、按照索引顺序排序(文档ID升序)
example.displayHits(allBooks,Sort.INDEXORDER);
5、通过某个域进行排序
首先,这个域索引时要指定为Field.Keyword域:如:Field.Keyword("size",1024);
其次,要创建新的索引对象
example.displayHits(allBooks,new Sort("category"));
6、以相反顺序排序
对于相关性和文档ID使用默认排序,其他域使用升序排序。使用true指明为倒序
example.displayHits(allBooks,new Sort("category",true));
7、根据多个域进行排序和指定排序域类型
先按category域,再按字段得分,然后按pubmonth(指定了pubmonth的排序域外为int类型)
example.displayHits(allBooks,new Sort(new SortField[]{
new SortField("category"),
SortField.FIELD_SCORE,
new SortField("pubmonth",SortField.INT,true)
}));
8、使用非默认的locale排序
public SortField(String field,Locale locale)
public SortField(String field,Locale locale,boolean reverse)
当按时SortField.STRING类型排序时,应用程序内部会默认地调用String.compareTo()来确定各个项的次序。通过Collator.getInstance(Locale)方法来指定本地的Collator对象,而该对象的Collator.compare()用于决定排序的方式