全文检索之lucene入门

   在上一篇HelloWorld的基础上,建立一个directory的包,添加一个DirectoryTest的测试类,用来根据指定的索引目录创建目录存放指引.


    DirectoryTest类中的代码如下,基本上就是在HelloWorld的基础上改改就可以了.

    里面一共三个方法,testDirectory(),测试创建索引库;testDirectoryFSAndRAM(),结合方法1的两种创建方式,优化;testDirectoryOptimize(),在方法2个基础上,研究索引的优化创建,减少创建的索引文件数.

[java]  view plain  copy
  1. package com.lucene.directory;  
  2.   
  3. import org.apache.lucene.analysis.Analyzer;  
  4. import org.apache.lucene.analysis.standard.StandardAnalyzer;  
  5. import org.apache.lucene.document.Document;  
  6. import org.apache.lucene.index.IndexWriter;  
  7. import org.apache.lucene.index.IndexWriter.MaxFieldLength;  
  8. import org.apache.lucene.store.Directory;  
  9. import org.apache.lucene.store.FSDirectory;  
  10. import org.apache.lucene.store.RAMDirectory;  
  11. import org.junit.Test;  
  12.   
  13. import com.lucene.units.File2DocumentUtils;  
  14.   
  15. /** 
  16.  * 创建索引库 
  17.  * @author liu 
  18.  * 
  19.  */  
  20. public class DirectoryTest {  
  21.   
  22.     // 需要查询的文件所在的路径  
  23.     String filePath = "F:\\Users\\liuyanling\\workspace\\LuceneDemo\\datasource\\peoplewhocannot.txt";  
  24.     // 设置索引存放的路径  
  25.     String indexPath = "F:\\Users\\liuyanling\\workspace\\LuceneDemo\\luceneIndex";  
  26.     // 设置分词器为标准分词器  
  27.     Analyzer analyzer = new StandardAnalyzer();  
  28.   
  29.     /** 
  30.      * 测试,自动建立索引库 
  31.      * @throws Exception 抛出异常 
  32.      */  
  33.     @Test  
  34.     public void testDirectory() throws Exception {  
  35.         //将索引生成到文件系统中(优点:数据永久保存;缺点:操作速度慢)  
  36.         Directory dir = FSDirectory.getDirectory(indexPath);  
  37.           
  38.         /*//将索引生成到内存中(优点:速度快,缺点:程序关闭,数据清除) 
  39.         Directory dir = new RAMDirectory();*/  
  40.           
  41.         //所以可以结合:1.生成的时候,生成到内存中;2.关闭的时候,保存起来.(参看下面的方法testDirectoryFSAndRAM)  
  42.   
  43.         Document doc = File2DocumentUtils.file2Document(filePath);  
  44.         IndexWriter indexWriter = new IndexWriter(dir, analyzer, true,MaxFieldLength.LIMITED);  
  45.         indexWriter.addDocument(doc);  
  46.   
  47.         indexWriter.close();  
  48.     }  
  49.       
  50.     /** 
  51.      * 测试,启动时读取内存中,退出时保存 
  52.      * @throws Exception 抛出异常 
  53.      */  
  54.     @Test  
  55.     public void testDirectoryFSAndRAM() throws Exception {  
  56.         //创建文件系统的索引库  
  57.         Directory fsDir = FSDirectory.getDirectory(indexPath);   
  58.           
  59.         //1.启动时读取  
  60.         //构造内存的索引库  
  61.         Directory ramDir = new RAMDirectory(fsDir);  
  62.         //运行程序时操作ramDir,构造操作内存索引库的索引器  
  63.         IndexWriter ramIndexWriter = new IndexWriter(ramDir,analyzer,MaxFieldLength.LIMITED);  
  64.         //添加文档Document,将文档创建索引到内存索引库  
  65.         Document doc = File2DocumentUtils.file2Document(filePath);  
  66.         ramIndexWriter.addDocument(doc);  
  67.         ramIndexWriter.close();  
  68.           
  69.         //2.退出时保存  
  70.         //构造文件系统的索引器,true表示要重写指定的存放索引目录下的索引文件,false则表示在指定存放索引目录下已经存在的索引文件的基础上,向其中继续追加新的索引文件。  
  71.         IndexWriter fsIndexWriter = new IndexWriter(fsDir,analyzer,true,MaxFieldLength.LIMITED);  
  72.         //不进行优化的添加索引,将内存中的索引库添加到文件系统中  
  73.         fsIndexWriter.addIndexesNoOptimize(new Directory[] {ramDir});  
  74.           
  75.         //fsIndexWriter.flush();  
  76.         //fsIndexWriter.optimize();  
  77.           
  78.         fsIndexWriter.close();  
  79.     }  
  80.       
  81.     /** 
  82.      * 索引生成,优化,合并索引文件,减少生成索引文件数 
  83.      * @throws Exception  
  84.      */  
  85.     @Test  
  86.     public void testDirectoryOptimize() throws Exception {  
  87.         //创建文件系统的索引库  
  88.         Directory fsDir = FSDirectory.getDirectory(indexPath);   
  89.         //构造索引器  
  90.         IndexWriter fsIndexWriter = new IndexWriter(fsDir,analyzer,MaxFieldLength.LIMITED);  
  91.         //使用索引器,优化的生成索引  
  92.         fsIndexWriter.optimize();  
  93.         fsIndexWriter.close();  
  94.     }  
  95.   
  96. }  

    查看运行效果,

     1.先测试testDirectory()Directory dir =FSDirectory.getDirectory(indexPath); 为体现效果,先删除现有的索引文件


         测试成功之后


    刷新项目,就可以看到新建好的索引.


       2.再测试testDirectory()Directory dir = new RAMDirectory();,还是删除索引文件,执行单元测试,成功,但是并没有在文件系统中生成可以看到的索引库。但是可以比较下,两种方法执行的时间,很明显的,在内存中创建速度相当快.


        3.由于在将索引生成到文件系统中(优点:数据永久保存;缺点:操作速度慢),而将索引生成到内存中(优点:速度快,缺点:程序关闭,数据清除),所以两者结合的testDirectoryFSAndRAM方法,先看下效果,因为没有索引文件,也不用删除.

    运行成功,时间比只用内存索引库和文件系统索引库都要长,但是这只是将一个Document文件创建成索引,如果是多个,那么该方法是会提高效率的.


          并且可以看到索引库也生成了。 


          4.现在为了执行优化的创建索引testDirectoryOptimize,先多创建几条索引。现在用testDirectoryFSAndRAM创建了4条索引了。

               执行HelloWorldsearch方法,可以看出是4条。


     接着执行优化方法


     索引文件由原来的48k的记录,变为124k的记录.从结果上看,一是体积减少;2是文件变少.


           5.现在知道了,先创建内存索引器来操作文档,结束时保存,在文件多的时候可以起到优化的作用,optimize方法可以减少索引的文件,以及体积,两个结合,可以生成优化的索引.其中,fsIndexWriter.flush();已经过时,把这句注了,运行也是成功的,效果也是有的.

[java]  view plain  copy
  1. //不进行优化的添加索引,将内存中的索引库添加到文件系统中  
  2. fsIndexWriter.addIndexesNoOptimize(new Directory[] {ramDir});  
  3.   
  4. //fsIndexWriter.flush();  
  5. fsIndexWriter.optimize();  

           以上就是lucene的创建索引库.指定索引位置,先在内存中创建索引,然后保存到文件系统中,同时可以进行优化,合并索引文件.下一篇是对于分词器,采用多种分词器,查看他们的分词效果,《全文检索之lucene的优化篇--分词器》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值