Beta笔记:对检索结果排序

对检索结果排序

1. 某些场合需要我们自定义搜索结果的排序方式,例如在学霸网站上可能要求,对搜索出来的文章按照 “浏览量”、"关注度"等等排序.

2. 使用 Sort 类来定制排序方式

   Sort sort = new Sort();

   实例化出一个 Sort 对象之后,可以为它设置多个排序字段:

   Sort.setSort(SortField field...) ,如:

      SortField field = new SortField("id", SortField.LONG) // 表示对 id 按照升序(默认)排列

      // 按降序排列:

      SortField field = new SortField("id", SortField.LONG, true). // true 表示对排序结果,默认为升序,反转后就是降序

 

/* 测试数据来源于 《Lucene-索引库的CRUD API 演示》 的 save 方法 */
public class SortTest {
        @Test
    public void test() throws Exception {
        // 搜索条件
        String queryString = "系统";
        // =================================================================
        // a, 把搜索字符串转为Query对象
        QueryParser queryParser = new QueryParser(Version.LUCENE_30, "content", Configuration.getAnalyzer());
        Query query = queryParser.parse(queryString);
        // b, 搜索,得到中间结果
        IndexSearcher indexSearcher = new IndexSearcher(Configuration.getDirectory());
        // --------------------------------------------
        // 自定义字段排序,效果就象数据库中的ORDER BY
        // TopDocs topDocs = indexSearcher.search(query, 100); // 返回前100条结果
        // TopDocs topDocs = indexSearcher.search(query, filter, n);
        // TopDocs topDocs = indexSearcher.search(query, filter, n, sort); // 参数 filter 可以设置为 null
        // Sort sort = new Sort(new SortField("id", SortField.LONG)); // 按id升序排列
        Sort sort = new Sort(new SortField("id", SortField.LONG, true)); // 按id降序排列,如果有多个排序要求,则增加多个SortField
        //sort.setSort(fields...)  // 添加多个排序
        TopDocs topDocs = indexSearcher.search(query, null, 100, sort);
        // --------------------------------------------
        ScoreDoc[] scoreDocs = topDocs.scoreDocs; // 前n条记录的信息
        // c, 处理结果
        List<Article> list = new ArrayList<Article>();
        for (int i = 0; i < scoreDocs.length; i++) {
            ScoreDoc scoreDoc = scoreDocs[i]; // 1,获得一个文档的信息
            Document doc = indexSearcher.doc(scoreDoc.doc); // 2,根据文档编号取出相应的Document
            list.add(ArticleDocumentUtils.document2Article(doc));// 3,把Document转为Article
        }
        // =================================================================
        // 显示结果
        for (Article article : list) {
            System.out.println("-------> id = " + article.getId());
            System.out.println("title   = " + article.getTitle());
            System.out.println("content = " + article.getContent());
        }
    }
}

 

posted @ 2012-11-29 00:20  MagicCode1023  阅读(330)  评论(0编辑  收藏  举报