• Lucene索引库的简单优化


      根据实际情况对索引库进行优化,可以提升创建索引和搜索的速度。

      1、合并索引库片段文件

      IndexWriter的optimize()方法已经过时,因为这个方法的效率很低。合并文件主要是使用IndexWriter的setMergeFactor(int)方法,但是在Lucene3.6版本中,该方法已过时,直接使用LogMergePolicy.setMergeFactor(int)方法代替。

      当setMergeFactor(int)的参数值较小的时候,创建索引的速度较慢。当参数值较大的时候,创建索引的速度就比较快。大于10适合批量创建索引。

      2、内存索引目录和文件系统索引目录结合使用

      内存索引目录的操作速度非常快,所以我们在操作索引的时候可以把索引库从文件系统加载到内存中,操作完成后再写回文件系统。

      内存中的索引文件写回到文建系统中的时候,我们需要对索引目录进行重建。比如原来文件系统中的索引目录有10个文件,加载到内存目录的时候是把10个文件拷贝一份到内存,然后我们添加了一个索引文件,内存中的索引目录文件数就变成11个,写会到文件系统的时候,内存索引目录文件数(11个)加上原来文件系统索引目录的文件数(10)就变成21个了,有10个文件是重复了,所以我们需要删除原来文件系统中的索引目录重新创建。

      但是如果索引库是巨大的,不建议使用,因为所需的内存很大。

      3、实现代码。 

      1 /**
      2  * 索引库的优化
      3  * @author Luxh
      4  */
      5 public class IndexOptimizeTest {
      6     
      7         //分词器
      8         private Analyzer analyzer;
      9         
     10         //索引存放目录
     11         private Directory directory;
     12         
     13         /**
     14          * 初始化Analyzer和Directory
     15          * @throws IOException 
     16          */
     17         @Before
     18         public void before() throws IOException {
     19             
     20             //建立一个标准分词器
     21             //Version.LUCENE_36 表示匹配Lucene3.6版本
     22             analyzer = new StandardAnalyzer(Version.LUCENE_36);
     23             
     24             //在当前路径下建立一个目录叫indexDir
     25             File indexDir = new File("./indexDir");
     26             
     27             //创建索引目录
     28             directory = FSDirectory.open(indexDir);
     29         }
     30         
     31         /**
     32          * 合并索引片段文件
     33          * @throws IOException 
     34          * @throws LockObtainFailedException 
     35          * @throws CorruptIndexException 
     36          */
     37         @Test
     38         public void testMergeFactor() throws CorruptIndexException, LockObtainFailedException, IOException {
     39             
     40             IndexWriterConfig indexWriterConfig = new IndexWriterConfig(Version.LUCENE_36,analyzer);
     41             
     42             LogMergePolicy mergePolicy = new LogByteSizeMergePolicy();
     43             //达到3个文件时就和合并
     44             mergePolicy.setMergeFactor(3);
     45             
     46             indexWriterConfig.setMergePolicy(mergePolicy);
     47             IndexWriter indexWriter = new IndexWriter(directory,indexWriterConfig);
     48             
     49             Book book = new Book();
     50             book.setId(1);
     51             book.setTitle("建筑的永恒之道");
     52             book.setAuthor("亚历山大");
     53             book.setContent("《建筑的永恒之道》提出了一个关于建筑设计、建筑和规划的新的理论、思想,该理论的核心是社会成员按照他们自己的存在状态设定他们生活的世界秩序,这一古老方式从根本上构成了新的后工业时代建筑的基础,这些建筑由人们创造。");
     54             
     55             //建立Document
     56             Document doc = new Document();
     57             //Store指定Field是否需要存储,Index指定Field是否需要分词索引
     58             doc.add(new Field("id",book.getId().toString(),Store.YES,Index.NOT_ANALYZED));
     59             doc.add(new Field("title",book.getTitle(),Store.YES,Index.ANALYZED));
     60             doc.add(new Field("author",book.getAuthor(),Store.YES,Index.ANALYZED));
     61             doc.add(new Field("content",book.getContent(),Store.YES,Index.ANALYZED));
     62 
     63             indexWriter.addDocument(doc);
     64             indexWriter.close();
     65             
     66         }
     67         
     68         /**
     69          * 内存索引目录和文件系统索引目录结合
     70          * @throws IOException 
     71          */
     72         @Test
     73         public void testDirectoryCombination() throws IOException {
     74             
     75             //创建内存索引目录,把文件系统中的索引库加载进来
     76             RAMDirectory ramDirectory = new RAMDirectory(directory);
     77             
     78             IndexWriterConfig ramIndexWriterConfig = new IndexWriterConfig(Version.LUCENE_36,analyzer);
     79             
     80             IndexWriter ramIndexWriter = new  IndexWriter(ramDirectory,ramIndexWriterConfig);
     81             
     82             Book book = new Book();
     83             book.setId(1);
     84             book.setTitle("建筑的永恒之道");
     85             book.setAuthor("亚历山大");
     86             book.setContent("《建筑的永恒之道》提出了一个关于建筑设计、建筑和规划的新的理论、思想,该理论的核心是社会成员按照他们自己的存在状态设定他们生活的世界秩序,这一古老方式从根本上构成了新的后工业时代建筑的基础,这些建筑由人们创造。");
     87             
     88             //建立Document
     89             Document doc = new Document();
     90             //Store指定Field是否需要存储,Index指定Field是否需要分词索引
     91             doc.add(new Field("id",book.getId().toString(),Store.YES,Index.NOT_ANALYZED));
     92             doc.add(new Field("title",book.getTitle(),Store.YES,Index.ANALYZED));
     93             doc.add(new Field("author",book.getAuthor(),Store.YES,Index.ANALYZED));
     94             doc.add(new Field("content",book.getContent(),Store.YES,Index.ANALYZED));
     95             
     96             ramIndexWriter.addDocument(doc);
     97             ramIndexWriter.close();
     98             
     99             IndexWriterConfig fsIndexWriterConfig = new IndexWriterConfig(Version.LUCENE_36,analyzer);
    100             //创建新的索引目录或者覆盖原来的索引目录
    101             fsIndexWriterConfig.setOpenMode(OpenMode.CREATE);
    102             
    103             IndexWriter fsIndexWriter = new IndexWriter(directory,fsIndexWriterConfig);
    104             //把内存中的索引库写到文件系统中
    105             fsIndexWriter.addIndexes(ramDirectory);
    106             fsIndexWriter.close();
    107             
    108         }
    109 
    110 }

      

      

  • 相关阅读:
    【win10系统问题】远程桌面登录一次后,第二次登录看不到用户名和密码输入框
    如何更改Arcmap里经纬度小数点后面的位数?
    腾讯视频qlv格式转换MP4普通视频方法
    kettle_Spoon 修改共享DB连接带汉字引发的错误
    AutoCAD2015激活码和密钥
    SQL获取本周,上周,本月,上月第一天和最后一天[注:本周从周一到周天]
    SQL语句 不足位数补0
    c# winform 服务器提交了协议冲突. Section=ResponseStatusLine
    java.net.ProtocolException: Server redirected too many times
    MarkDown空格缩进的方法
  • 原文地址:https://www.cnblogs.com/luxh/p/2559123.html
Copyright © 2020-2023  润新知