lucene查询分页总结,利用searchAfter等
首先介绍IndexSearch几个常用方法,其他search方法的具体含义请查找lucene API
- void search(Collector results)//低版本Lucene的search方法
- TopDocs search(Query query,int n)//返回前n条结果
- TopDocs searchAfter(ScoreDoc after,Query query,int n)//从after以下下查找n条结果
一、利用TopScoreDocCollector进行分页
- Query query = MultiFieldQueryParser.parse(Version.LUCENE_35,searchString, fields, clauses, ikAnalyzer);//创建一个查询
- TopScoreDocCollectortopCollector=TopScoreDocCollector.create(indexSearch.maxDoc(), false);//返回所有条数的一个集合
- indexSearch.search(query, topCollector);
- System.out.println("一共有多少条记录命中:"+topCollector.getTotalHits());
- int start = (page - 1) * pageMaxCount;//start:开始条数 pageMaxCount:显示多少条
- ScoreDoc[]docs= topCollector.topDocs(start, pageMaxCount).scoreDocs;
- for (int i = 0; i < docs.length; i++) {
- Document doc = indexSearch.doc(docs[i].doc);
- //......获取结果操作
- }
一、利用 search(Query query,int n)分页
- 主要思路是先得到前n条结果,然后舍弃前面页码的结果,得到页面的结果
- 如每页的显示数量:pageCount=10,要查询第10页的结果,那么先查出10*10=100条的结果,丢掉前90条结果就是最终的结果!
- //索引排序条件
- SortField[] sortfield = new SortField[] { SortField.FIELD_SCORE,
- new SortField(null,SortField.DOC, true) };
- Sort sort = new Sort(sortfield);
- TopDocs topDocs = searcher.search(query, null, 10, sort);
- System.out.println("检索到总数:" + topDocs.totalHits);
- ScoreDoc[] scoreDocs = topDocs.scoreDocs;
二、利用searchAfter(ScoreDoc after,Query query,int n)分页
- Query query=queryParser.parse(str);
- TopDocs result = indexSearch.search(query,10);
- intindex=(page.getCurrentPage()-1)*page.getPageSize();
- ScoreDoc scoreDoc=null;
- //若是当前页是第一页面scoreDoc=null。
- if(index>0){
- //因为索引是从0开端所以要index-1
- scoreDoc=result.scoreDocs[index-1];
- }
- scoreDoc=result.scoreDocs[index-1];
- TopDocs hits= indexSearch.searchAfter(scoreDoc, query, page.getPageSize())
No comments:
Post a Comment