说明:
1) 在全文检索系统中,一般查询出来的内容比较多,所以必须将查询出来的内容进行分页处理。
2) 原理同hibernate的分页查询。在hibernate的分页查询中,有两个参数:
int firstResult 当前页的第一行在数据库里的行数
int maxResult 每页显示的页数
3) 返回值不仅包括查询结果,还应该有总记录数,用SearchResult来封装
1 @Test 2 public void testCreateIndexBatch() throws Exception { 3 IndexWriter indexWriter = new IndexWriter(LuceneUtils.directory, 4 LuceneUtils.analyzer, MaxFieldLength.LIMITED); 5 6 for (int i = 0; i < 25; i++) { 7 8 Article article = new Article(); 9 article.setId(1L + i); 10 article.setTitle("lucene可以做搜索引擎"); 11 article.setContent("baidu,google都是很好的搜索引擎"); 12 indexWriter.addDocument(DocumentUtils.article2Document(article)); 13 } 14 15 indexWriter.close(); 16 } 17 18 /** 19 * 20 * @param firstResult 21 * 当前页的第一行在集合中的位置 22 * @param maxResult 23 * 每页显示的最大的行数 24 * @throws Exception 25 */ 26 public void testSearchIndexDispage(int firstResult, int maxResult) 27 throws Exception { 28 29 IndexSearcher indexSearcher = new IndexSearcher(LuceneUtils.directory); 30 31 QueryParser parser = new MultiFieldQueryParser(Version.LUCENE_30, 32 new String[] { "title", "content" }, LuceneUtils.analyzer); 33 34 Query query = parser.parse("lucene"); 35 36 TopDocs topDocs = indexSearcher.search(query, 25); 37 38 int count = Math.min(topDocs.totalHits,firstResult+maxResult); 39 40 ScoreDoc[] scoreDocs = topDocs.scoreDocs; 41 42 List<Article> articleList = new ArrayList<Article>(); 43 for(int i=firstResult;i<count;i++){ 44 Document document = indexSearcher.doc(scoreDocs[i].doc); 45 Article article = DocumentUtils.document2Article(document); 46 articleList.add(article); 47 } 48 49 for(Article article:articleList){ 50 System.out.println(article.getId()); 51 System.out.println(article.getTitle()); 52 System.out.println(article.getContent()); 53 } 54 } 55 56 @Test 57 public void testDispage() throws Exception{ 58 this.testSearchIndexDispage(10, 10); 59 }