前面介绍完查询以后,现在要对查询结果进行排序的显示。
代码:
package com.querytype;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.Hits;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.Sort;
import org.apache.lucene.search.SortField;
public class QuerySortDemo2 {
/**
* @param args
*/
public static void main(String[] args) {
try {
/*
* Document doc1 = new Document(); Field f1 = new
* Field("bookNumber","003",Field.Store.YES, Field.Index.TOKENIZED);
* Field f2 = new Field("bookname","钢铁是怎样炼成的",Field.Store.YES,
* Field.Index.TOKENIZED); Field f3 = new
* Field("publishdate","1970-01-01",Field.Store.YES,
* Field.Index.TOKENIZED); doc1.add(f1); doc1.add(f2); doc1.add(f3);
* Document doc2 = new Document(); f1 = new
* Field("bookNumber","001",Field.Store.YES, Field.Index.TOKENIZED);
* f2 = new Field("bookname","钢铁是怎样炼成的2",Field.Store.YES,
* Field.Index.TOKENIZED); f3 = new
* Field("publishdate","1990-01-01",Field.Store.YES,
* Field.Index.TOKENIZED); doc2.add(f1); doc2.add(f2); doc2.add(f3);
* Document doc3 = new Document(); f1 = new
* Field("bookNumber","004",Field.Store.YES, Field.Index.TOKENIZED);
* f2 = new Field("bookname","钢铁是怎样炼成的4",Field.Store.YES,
* Field.Index.TOKENIZED); f3 = new
* Field("publishdate","1980-01-01",Field.Store.YES,
* Field.Index.TOKENIZED); doc3.add(f1); doc3.add(f2); doc3.add(f3);
*
* Document doc4 = new Document(); f1 = new
* Field("bookNumber","004",Field.Store.YES, Field.Index.TOKENIZED);
* f2 = new Field("bookname","钢铁是怎样炼成的4",Field.Store.YES,
* Field.Index.TOKENIZED); f3 = new
* Field("publishdate","1970-01-01",Field.Store.YES,
* Field.Index.TOKENIZED); doc4.add(f1); doc4.add(f2); doc4.add(f3);
*
*
* File file = new File("d://demo"); Analyzer luceneAnalyzer = new
* StandardAnalyzer(); IndexWriter writer = new IndexWriter(file,
* luceneAnalyzer, true); writer.setUseCompoundFile(true);
* writer.optimize(); writer.addDocument(doc1);
* writer.addDocument(doc2); writer.addDocument(doc3);
* writer.addDocument(doc4); writer.close();
*/
IndexSearcher search = new IndexSearcher("d://demo");
String field = "bookname";
String queryStr = "钢铁";
QueryParser parser = new QueryParser(field, new StandardAnalyzer());
Query q = parser.parse(queryStr);
//上面的查询是通过QueryParser来查询,下面通过SORT来进行排序,排序规则是首先根据bookNumber来排序,然后再根据publishdate来排序,第二个参数表示该字段是什么类型,第三个字段表示排列顺序(FALSH:升序,TRUE:降序)
Sort sort = new Sort();
SortField f1 = new SortField("bookNumber", SortField.INT, false);
SortField f2 = new SortField("publishdate", SortField.STRING, false);
sort.setSort(new SortField[] { f1, f2 });
//如果指定多个FIELD来进行排序,就把多个FIELD组合成数据塞到SORT中
Hits hits = search.search(q, sort);
System.out.println(q.toString());
for (int i = 0; i < hits.length(); i++) {
Document doc = hits.doc(i);
System.out.println("书名:" + doc.get("bookname") + "\t\t");
System.out.println("书号:" + doc.get("bookNumber"));
System.out.println("出版日期:" + doc.get("publishdate"));
System.out.println("#####################");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
SortField提供的FIELD的类型:string,int,float.指定FIELD的类型对排序过程的效率有巨大的影响。