Lucene_demo05_内存索引和文件索引

内存索引库:数据是临时的、访问速度比文件索引库要快、索引库中的数据不能存放太多、内存索引库和文件索引库能结合在一起 
两个或者两个以上的索引库的合并: 
    如果是内存索引库,直接调用构造函数进行合并就可以了 内存索引库中。也可以调用addIndexesNoOptimize进行合并 
    如果是文件索引库,调用addIndexesNoOptimize进行合并,该方法可以接受多个索引库 


Java代码   收藏代码
  1. public class RamIndex {  
  2.     /** 
  3.      * 内存索引库 
  4.      */  
  5.     @Test  
  6.     public void testRAM() throws Exception {  
  7.         // 创建了内存索引库  
  8.         Directory directory = new RAMDirectory();  
  9.         IndexWriter indexWriter = new IndexWriter(directory, LuceneUtils.analyzer, MaxFieldLength.LIMITED);  
  10.         Article article = new Article();  
  11.         article.setId(26L);  
  12.         article.setTitle("NBA总冠军");  
  13.         article.setContent("LBJ和韦德能带领热火在2013赛季拿到NBA总冠军吗");  
  14.         Document document = DocumentUtils.article2Document(article);  
  15.         indexWriter.addDocument(document);  
  16.         indexWriter.close();  
  17.         this.showData(directory);  
  18.     }  
  19.   
  20.     /** 
  21.      * 内存索引库和文件索引库的结合 
  22.      */  
  23.     @Test  
  24.     public void testRamIndexAndFileIndex() throws Exception {  
  25.         Directory fileDirectory = FSDirectory.open(new File("./indexDir"));// 创建两个索引库  
  26.         Directory ramDirectory = new RAMDirectory(fileDirectory);  
  27.   
  28.         // 内存索引  
  29.         IndexWriter ramIndexWriter = new IndexWriter(ramDirectory, LuceneUtils.analyzer, MaxFieldLength.LIMITED);// 这个ramIndexWriter是针对内存索引库  
  30.         Article article = new Article();  
  31.         article.setId(26L);  
  32.         article.setTitle("热火赢了总冠军");  
  33.         article.setContent("哈哈,热火终于赢了,果然不负众望!!");  
  34.         Document document = DocumentUtils.article2Document(article);  
  35.         ramIndexWriter.addDocument(document);  
  36.         ramIndexWriter.close();  
  37.   
  38.         // 文件索引  
  39.         IndexWriter fileIndexWriter = new IndexWriter(fileDirectory, LuceneUtils.analyzer, true, MaxFieldLength.LIMITED);// fileIndexWriter对应的索引库是fileDirectory  
  40.         fileIndexWriter.addIndexesNoOptimize(ramDirectory);// 把内存索引库的信息写入到文件索引库addIndexesNoOptimize  
  41.         fileIndexWriter.close();  
  42.   
  43.         // 经过两个索引操作后,输出最后的数据  
  44.         this.showData(fileDirectory);  
  45.     }  
  46.   
  47.     /** 
  48.      * 当应用程序启动的时候,直接和内存索引库交互,当程序快结束的时候,把内存索引库中的内容追加到文件索引库中 
  49.      */  
  50.     @Test  
  51.     public void testRamIndexAndFileIndex2() throws Exception {  
  52.         // 内存索引  
  53.         Directory directory = new RAMDirectory();  
  54.         IndexWriter ramIndexWriter = new IndexWriter(directory, LuceneUtils.analyzer, MaxFieldLength.LIMITED);  
  55.         Article article = new Article();  
  56.         article.setId(27L);  
  57.         article.setTitle("热火赢了总冠军");  
  58.         article.setContent("哈哈,热火终于赢了,果然不负众望!!");  
  59.         Document document = DocumentUtils.article2Document(article);  
  60.         ramIndexWriter.addDocument(document);  
  61.         ramIndexWriter.close();  
  62.   
  63.         // 文件索引  
  64.         Directory fileDirectory = FSDirectory.open(new File("./indexDir"));  
  65.         IndexWriter fileIndexWriter = new IndexWriter(fileDirectory, LuceneUtils.analyzer, MaxFieldLength.LIMITED);  
  66.         fileIndexWriter.addIndexesNoOptimize(directory);  
  67.         fileIndexWriter.close();  
  68.   
  69.         // 经过两个索引操作后,输出最后的数据  
  70.         this.showData(fileDirectory);  
  71.     }  
  72.   
  73.     // 公共输出类  
  74.     private void showData(Directory directory) throws Exception {  
  75.         IndexSearcher indexSearcher = new IndexSearcher(directory);  
  76.         QueryParser queryParser = new MultiFieldQueryParser(Version.LUCENE_30, new String[] { "title""content" }, LuceneUtils.analyzer);  
  77.         Query query = queryParser.parse("总冠军");  
  78.         TopDocs topDocs = indexSearcher.search(query, 50);  
  79.         ScoreDoc[] scoreDocs = topDocs.scoreDocs;  
  80.         List<Article> articleList = new ArrayList<Article>();  
  81.         for (int i = 0; i < scoreDocs.length; i++) {  
  82.             Document document = indexSearcher.doc(scoreDocs[i].doc);  
  83.             Article article = DocumentUtils.document2Article(document);  
  84.             articleList.add(article);  
  85.         }  
  86.   
  87.         // 输出查询出来的索引对象  
  88.         for (Article article : articleList) {  
  89.             System.out.println(article.getId());  
  90.             System.out.println(article.getTitle());  
  91.             System.out.println(article.getContent());  
  92.         }  
  93.     }  
  94. }  

猜你喜欢

转载自summer85.iteye.com/blog/2045931