lucene(6)—lucene索引优化之多线程创建索引
前面了解到lucene在索引创建的时候一个IndexWriter获取到一个读写锁,这样势在lucene创建大数据量的索引的时候,执行效率低下的问题;
查看前面文档 lucene(5)—lucene的索引构建原理 可以看出,lucene索引的建立,跟以下几点关联很大;
- 磁盘空间大小,这个直接影响索引的建立,甚至会造成索引写入提示完成,但是没有同步的问题;
- 索引合并策略的选择,这个类似于sql里边的批量操作,批量操作的数量过多直接影响执行效率,对于lucene来讲,索引合并前是将document放在内存中,因此选择合适的合并策略也可以提升索引的效率;
- 唯一索引对应的term的选择,lucene索引的创建过程中是先从索引中删除包含相同term的document然后重新添加document到索引中,这里如果term对应的document过多,会占用磁盘IO,同时造成IndexWriter的写锁占用时间延长,相应的执行效率低下;
综上所述,索引优化要保证磁盘空间,同时在term选择上可以以ID等标识来确保唯一性,这样第一条和第三条的风险就规避了;
本文旨在对合并策略和采用多线程创建的方式提高索引的效率;
多线程创建索引,我这边还设计了多目录索引创建,这样避免了同一目录数据量过大索引块合并和索引块重新申请;
废话不多说,这里附上代码,代码示例是读取lucene官网下载并解压的文件夹并给文件信息索引起来
首先定义FileBean来存储文件信息
|
|
接下来是一个工具类,用以将文件夹的信息遍历读取并转换成FileBean的集合
|
|
定义一个公共的用于处理索引的类
|
|
FileBeanIndex类用于处理FileBean的索引创建
|
|
IndexUtil工具类里边设置索引合并的策略
|
|
TestIndex类执行测试程序
|
|
以上即是多线程多目录索引,大家有什么疑问的欢迎交流;