全文检索之lucene的优化篇 建索引库

全文检索之lucene的优化篇 建索引库

作者: 发布日期:2015-01-02 00:16:04
Tag标签: 全文检索 索引
  • 在上一篇HelloWorld的基础上,建立一个directory的包,添加一个DirectoryTest的测试类,用来根据指定的索引目录创建目录存放指引.


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

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

    01. package com.lucene.directory;
    02.
    03. import org.apache.lucene.analysis.Analyzer;
    04. import org.apache.lucene.analysis.standard.StandardAnalyzer;
    05. import org.apache.lucene.document.Document;
    06. import org.apache.lucene.index.IndexWriter;
    07. import org.apache.lucene.index.IndexWriter.MaxFieldLength;
    08. import org.apache.lucene.store.Directory;
    09. 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条索引了。

    执行HelloWorld的search方法,可以看出是4条。


    接着执行优化方法


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


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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值