Lucene的排序搜索
默认根据文档查询的相关度得分来进行排序,得分越高,排名越前。
1、设置Lucene的文档对象Document中的一个促进因子,可以提高相关度得分。
Book book = new Book();
book.setId(2);
book.setTitle("建筑的永恒之道");
book.setAuthor("亚历山大");
book.setContent("《建筑的永恒之道》提出了一个关于建筑设计、建筑和规划的新的理论、思想.");
book.setPrice(65.5F);
Document doc = new Document();
doc.add(new Field("id",String.valueOf(book.getId()),Store.YES,Index.NOT_ANALYZED));
doc.add(new Field("title",book.getTitle(),Store.YES,Index.ANALYZED));
doc.add(new Field("author",book.getAuthor(),Store.YES,Index.ANALYZED));
doc.add(new Field("price",String.valueOf(book.getPrice()),Store.YES,Index.ANALYZED));
doc.add(new Field("content",book.getContent(),Store.YES,Index.ANALYZED));
//设置促进得分因子值,值越大,得分越高.默认值是1.0F.
doc.setBoost(2.0F);
2、自定义排序。
比如我们需要按图书的价格排序。我们需要用到IndexSearcher的search方法。search方法有很多的重载。我们使用search(Query query,int n,Sort sort)这个方法。
search(Query query,int n,Sort sort)方法参数解释:
query -----> Lucene的查询对象。
n -----> 返回前n条记录。
sort -----> 排序对象。
//按价格升序排序
//Sort sort = new Sort(new SortField("price",SortField.FLOAT));
//按价格降序排序
Sort sort = new Sort(new SortField("price",SortField.FLOAT,true));
//可按多个属性排序
//Sort sort1 = new Sort(new SortField("price",SortField.FLOAT),new SortField("id",SortField.FLOAT));
//排序搜索,返回符合条件的前10条记录. TopFieldDocs是TopDocs的子类
TopFieldDocs topFieldDocs = indexSearcher.search(query,10, sort);
//搜索结果总数量
int totalCount = topFieldDocs.totalHits;
// 搜索的结果列表
ScoreDoc[] scoreDocs = topFieldDocs.scoreDocs;