利用 Lucene,在创建索引的工程中你可以充分利用机器的硬件资源来提高索引的效率。当你需要索引大量的文件时,你会注意到索引过程的瓶颈是在往磁盘上写索引文件的过程中。为了解决这个问题, Lucene 在内存中持有一块缓冲区。但我们如何控制 Lucene 的缓冲区呢?幸运的是,Lucene 的类 IndexWriter 提供了三个参数用来调整缓冲区的大小以及往磁盘上写索引文件的频率。

1.合并因子(mergeFactor)

这 个参数决定了在 Lucene 的一个索引块中可以存放多少文档以及把磁盘上的索引块合并成一个大的索引块的频率。比如,如果合并因子的值是 10,那么当内存中的文档数达到 10 的时候所有的文档都必须写到磁盘上的一个新的索引块中。并且,如果磁盘上的索引块的隔数达到 10 的话,这 10 个索引块会被合并成一个新的索引块。这个参数的默认值是 10,如果需要索引的文档数非常多的话这个值将是非常不合适的。对批处理的索引来讲,为这个参数赋一个比较大的值会得到比较好的索引效果。

2.最小合并文档数

这个参数也会影响索引的性能。它决定了内存中的文档数至少达到多少才能将它们写回磁盘。这个参数的默认值是10,如果你有足够的内存,那么将这个值尽量设的比较大一些将会显著的提高索引性能。

3.最大合并文档数

这个参数决定了一个索引块中的最大的文档数。它的默认值是 Integer.MAX_VALUE,将这个参数设置为比较大的值可以提高索引效率和检索速度,由于该参数的默认值是整型的最大值,所以我们一般不需要改动这个参数。
     //indexDir is the directory that hosts Lucene's index files     File    indexDir = new File("C://luceneIndex");     Analyzer luceneAnalyzer = new StandardAnalyzer();     File[] textFiles   = fileDir.listFiles();     long startTime = new Date().getTime();

     int mergeFactor = 10;     int minMergeDocs = 10;     int maxMergeDocs = Integer.MAX_VALUE;     IndexWriter indexWriter = new IndexWriter(indexDir,luceneAnalyzer,true);              indexWriter.mergeFactor = mergeFactor;     indexWriter.minMergeDocs = minMergeDocs;     indexWriter.maxMergeDocs = maxMergeDocs;

     //Add documents to the index     for(int i = 0; i   > textFiles[i].getName().endsWith(".txt")){         Reader textReader = new FileReader(textFiles[i]);         Document document = new Document();         document.add(Field.Text("content",textReader));         document.add(Field.Keyword("path",textFiles[i].getPath()));         indexWriter.addDocument(document);       }     }

     indexWriter.optimize();     indexWriter.close();     long endTime = new Date().getTime();

     System.out.println("MergeFactor: " + indexWriter.mergeFactor);     System.out.println("MinMergeDocs: " + indexWriter.minMergeDocs);     System.out.println("MaxMergeDocs: " + indexWriter.maxMergeDocs);     System.out.println("Document number: " + textFiles.length);     System.out.println("Time consumed: " + (endTime - startTime) + " milliseconds");   }} 

判断索引目录的segments文件是否存在,
    如果存在,用增量索引
        否则, 重新创建索引

如果是重新创建索引
    只需要遍历需要索引的内容,然后新增文档
        
 如果是增量索引
    判断主Key[文件名(包含全路径)]在索引中是否存在
        如果存在
            判断[文件的修改时间],是否和索引中保存的[修改时间]一致
            如果不一致
                删除旧的索引中的该索引项目
                新增对该文档的索引
       否则
            新增该文档的索引 缺点,不能发现已经删除的文件,当然是认为的去某个目录删除该文件。
      如果是程序的话当然是可以的,只需要把索引中的项目删除。

lucene索引合并与增量索引相关推荐

  1. 索引合并和组合索引的比较

    在教务系统补考子系统的开发过程中,安排考场的算法运算时间非常慢,需要32秒才能完成考场的分配.查找原因,由于需要在学生补考科目表里面进行查找数据--该表的数据目前已达200万条,所以算法的大部分时间都 ...

  2. coreseek实时索引更新之增量索引

    coreseek实时索引更新有两种选择: 1.使用基于磁盘的索引,手动分区,然后定期重建较小的分区(被称为"增量").通过尽可能的减小重建部分的大小,可以将平均索引滞后时间降低到3 ...

  3. Coreseek:部门查询和增量索引代替实时索引

    1.行业调查 索引系统需要通过主查询来获取所有的文档信息,一个简单的实现是整个表的数据到内存,但是这可能会导致整个表被锁定,并且使其它操作被阻止(例如:在MyISAM格款式上INSERT操作).同时, ...

  4. 《DBNotes:single_table访问方法、MRR多范围读取优化、索引合并》

    目录 single_table访问方法 const ref ref_or_null range index all MRR多范围读取优化 索引合并 intersection union sort-un ...

  5. Elasticsearch7.15.2 mysql8.0.26 logstash-input-jdbc 数据增量索引构建

    文章目录 一.基础软件安装 1. 安装mysql 2. Elasticsearch7.15.2 安装部署 3. kibana 安装部署 4. logstash-input-jdbc 安装部署 二.数据 ...

  6. mysql 索引合并_MySQL 索引合并(Index Merge)优化

    本文问题 什么是Index Merge?Index Merge的限制有哪些? 如何查看语句是否使用了Index Merger? Index Merge有哪几种?分别适用于那些情景? 如何控制优化器是否 ...

  7. mysql 查询优化 非索引_mysql 查询优化和索引使用心得

    -- sql优化案例 -- 1.not in 用left join on 替换 -- 2.like '%XXX%' 用 like 'XXX%' 替换 -- 3.limit 优化 实用,在分页中 EXP ...

  8. Solr与MongoDB集成,实时增量索引[转]

    http://www.123905.com/ 一. 概述 大量的数据存储在MongoDB上,需要快速搜索出目标内容,于是搭建Solr服务. 另外一点,用Solr索引数据后,可以把数据用在不同的项目当中 ...

  9. 搜索引擎Lucene(2):索引文件结构及格式

    1.索引总体结构 1.1.索引层次结构 Lucene的索引结构主要分以下几个层次: 索引结构.png 索引(Index): 在Lucene中一个索引是放在一个文件夹中的.同一文件夹中的所有的文件构成一 ...

最新文章

  1. 全国四级网络工程师操作系统部分考纲
  2. Winform开发框架中工作流模块的业务表单开发
  3. Hibernate占位符问题[use named parameters or JPA-style positional parameters instead.]
  4. P2038 无线网络发射器选址
  5. leetcode之回溯backtracing专题5
  6. MSSQL 如何采用sql语句 获取建表字段说明、字段备注、字段类型、字段长度
  7. java 日期加一天_漫话:如何给女朋友解释为什么一到年底,部分网站就会出现日期混乱的现象?...
  8. 小米9震撼发布!米粉大呼价格太良心 2999元起稳了吗?
  9. linux php mysql 中文_Linux下PHP+MySQL+CoreSeek中文检索引擎配置 | 系统运维
  10. C语言叠堆在变量周围,C语言及ARM中堆栈指针SP设置的理解与总结
  11. STM32基于TFTP固件升级经验分享
  12. 为什么调试的时候需要编译选项中添加 -g,readelf命令.
  13. java多行注释_Java注释:单行、多行和文档注释
  14. 弘辽科技:新手拼多多店铺该怎么引流
  15. 【MySQL学习】DQL语言的学习 Data Query Language
  16. 2021年10月考试总结
  17. faster rcnn:towards real-time object detection with region proposal network
  18. 测试手机是否降频软件,如何检测自己的iPhone是否被苹果降频 降频的处理方法有哪些...
  19. 就一个翻译功能,百度你都跟不上谷歌,无力吐槽
  20. QQ那些厚黑又细腻的人性社交设计

热门文章

  1. PL/pgSQL的anyelement例子
  2. Silverlight与WPF中BeginInvoke的差异
  3. 【Android Gradle 插件】ProductFlavor 配置 ( applicationId 配置 | SdkVersion 相关配置 | version 应用版本配置 )
  4. 【计算机网络】网络安全 : 公钥分配 ( 公钥使用者 | 公钥分配 | CA 证书格式 | CA 证书吊销 )
  5. 【Android 性能优化】布局渲染优化 ( 过渡绘制 | 背景设置产生的过度绘制 | Android 系统的渲染优化 | 自定义布局渲染优化 )
  6. SpringBoot-(6)-日志SLF4j
  7. UOJ42/BZOJ3817 清华集训2014 Sum 类欧几里得
  8. Python有趣现象(不定时更新)
  9. vuex数据管理-数据适配
  10. 通过案例对 spark streaming 透彻理解三板斧之一: spark streaming 另类实验