博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
lucene4.7 锁机制(十)
阅读量:6255 次
发布时间:2019-06-22

本文共 2579 字,大约阅读时间需要 8 分钟。

hot3.png

lucene4.7 锁机制(十) 博客分类: 搜索引擎,爬虫 java

Lucene的索引体系是一个写独占,读共享的结构,这意味着,我们在使用多线程进行添加索引时,性能并不会得到明显的提升,所以任何时刻只能有一个线程对索引进行写入操作,而保障这个操作的安全性则是来自于,Lucene独特的锁机制(写入操作进行时,我们可以在Lucene的索引根目录里看到一个命名为write.lock的锁文件),如果同一时刻有多个不同IndexWriter对索引进行写入操作,那么将会引发锁重叠异常,所以Lucene的特殊的索引结构,决定了其只能使用一个IndexWriter对索引进行添加操作。 

即使是限定Lucen只能使用一个线程进行写入操作,Lucene的写入性能也是非常高效的,特别是在Lucene4.x之后,更是优异,我们可以根据自己服务器的硬件环境,来调优一些参数,利用上批处理的特性,可以大大提升写入性能。 
前面说过,Lucene写入时只能用一个线程操作,那么假如我们想使用多线程写入来提速可以吗? 
答案是肯定的,虽然Lucene限定只能用一个线程写入,但是这个限制仅仅指的是对一个索引文件的限制,我们可以采取一种折中的方式,利用多个线程写入多个索引文件夹目录,最后在对这几个索引文件合并,由此来提升索引速度,Lucene的API也支持多个索引文件的合并,所以采用这种方式来建索引,也能够大大的提升索引性能,这种方式尤其适用于对数据库的数据建索引,我们可以采用分页读的方式,由某个固定数目的线程来建索引。 
本篇就来介绍下,如何使用LuceneD的API 来对多个索引文件进行合并操作,合并操作大多数时候要求我们的数据结构是要一致的,当然Lucene是一种文档型的松散的存储结构,某个文档里也可以存储自己特有的字段,而其他的文档里,则没有,不过既然是我们需要合并,那么就要求大多数的结构是要一致的,否则两个完全不同类型的索引,合并到一起也是不符合逻辑的。 
为了演示合并,就建立了2份索引,然后对这两份索引进行合并。截图如下:

合并的核心代码如下: 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/***
     
* @author 秦东亮
     
* lucene 技术交流群:324714439
     
* 测试多个索引之间
     
* 进行合并的方法
     
* **/
      
public 
static 
void 
combineMoreIndex(){
           
          
try
{
          
Directory d1=FSDirectory.open(
new 
File(
"E:\\1\\a"
));
//打开存放索引1的路径
          
Directory d2=FSDirectory.open(
new 
File(
"E:\\2\\a"
));
//打开存放索引2的路径
           
          
Directory d3=FSDirectory.open(
new 
File(
"E:\\3\\ab"
));
//合并到索引3里面
           
           
IndexWriter writer=
new 
IndexWriter(d3, 
new 
IndexWriterConfig(Version.LUCENE_44, 
new 
IKAnalyzer()));
           
           
writer.addIndexes(d1,d2);
//传入各自的Diretory或者IndexReader进行合并
           
writer.commit();
//提交索引
           
writer.close();
           
System.out.println(
"合并索引完毕........."
);
           
           
          
}
catch
(Exception e){
              
e.printStackTrace();
          
}
      
}

生成的第三份索引,截图如下:

下面我们来看下,合并前,1,2索引和合并后的3索引的数据变化信息。 

1
2
3
4
5
6
  
System.out.println(
"==============1a========================="
);
           
showAll(
"E:\\1\\a"
);
           
System.out.println(
"==============2a========================="
);
           
showAll(
"E:\\2\\a"
);
           
System.out.println(
"==============合并后========================="
);
           
showAll(
"E:\\3\\ab"
);

输出结果如下,注意里面有日期为null的,代表这个文档没有日期的这个字段。 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
==============1a=========================
a===>中国  日期: ===> 
null
b===>法国  日期: ===> 
1389783935597
c===>中国  日期: ===> 
null
d===>英国  日期: ===> 
null
==============2a=========================
q===>中国  日期: ===> 
null
w===>法国  日期: ===> 
1389783980586
r===>中国  日期: ===> 
null
d===>英国  日期: ===> 
null
==============合并后=========================
a===>中国  日期: ===> 
null
b===>法国  日期: ===> 
1389783935597
c===>中国  日期: ===> 
null
d===>英国  日期: ===> 
null
q===>中国  日期: ===> 
null
w===>法国  日期: ===> 
1389783980586
r===>中国  日期: ===> 
null
d===>英国  日期: ===> 
null
 
 
http://my.oschina.net/MrMichael/blog/220966

转载于:https://my.oschina.net/xiaominmin/blog/1597459

你可能感兴趣的文章
EntityFramework之一对一关系(二)
查看>>
我心中的核心组件(可插拔的AOP)~调度组件quartz.net续~任务管理器的开发(CronTrigger强大功能)...
查看>>
Html2Text
查看>>
spring boot + mybatis实现一对一,一对多的样码之一种
查看>>
Android OpenGL ES 应用(二) 纹理
查看>>
谈谈D2
查看>>
解决li在ie,firefox中行高不一致问题
查看>>
[译] OpenStack Liberty 版本中的53个新变化
查看>>
How to mount usb device in CentOS?
查看>>
机器学习中的贝叶斯方法---当后验分布无法计算时如何求得预测模型?
查看>>
Kali无法定位软件包的解决方案
查看>>
Webwork 学习之路【01】Webwork与 Struct 的前世今生
查看>>
串口调试问题 【转】
查看>>
利用客户端缓存对网站进行优化
查看>>
Elasticsearch之head插件安装之后的浏览详解
查看>>
zabbix监控-基本原理介绍
查看>>
循环神经网络(RNN)模型与前向反向传播算法
查看>>
使用bash编写Linux shell脚本--参数和子壳
查看>>
现代软件工程讲义 5 项目经理 Program Manager
查看>>
DotNet语音技术实现(实现电脑发音)
查看>>