http://www.iteye.com/job/topic/1133159
Lucene 的索引体系是一个写独占,读共享的结构,这意味着,我们在使用多线程进行添加索引时,性能并不会得到明显的提升,所以任何时刻只能有一个线程对索引进行写 入操作,而保障这个操作的安全性则是来自于,Lucene独特的锁机制(写入操作进行时,我们可以在Lucene的索引根目录里看到一个命名为 write.lock的锁文件),如果同一时刻有多个不同IndexWriter对索引进行写入操作,那么将会引发锁重叠异常,所以Lucene的特殊的 索引结构,决定了其只能使用一个IndexWriter对索引进行添加操作。
即使是限定Lucen只能使用一个线程进行写入操作,Lucene的写入性能也是非常高效的,特别是在Lucene4.x之后,更是优异,我们可以根据自己服务器的硬件环境,来调优一些参数,利用上批处理的特性,可以大大提升写入性能。
前面说过,Lucene写入时只能用一个线程操作,那么假如我们想使用多线程写入来提速可以吗?
答案是肯定的,虽然Lucene限定只能用一个线程写入,但是这个限制仅仅指的是对一个索引文件的限制,我们可以采取一种折中的方式,利用多个线
程写入多个索引文件夹目录,最后在对这几个索引文件合并,由此来提升索引速度,Lucene的API也支持多个索引文件的合并,所以采用这种方式来建索
引,也能够大大的提升索引性能,这种方式尤其适用于对数据库的数据建索引,我们可以采用分页读的方式,由某个固定数目的线程来建索引。
本篇散仙就来介绍下,如何使用LuceneD的API
来对多个索引文件进行合并操作,合并操作大多数时候要求我们的数据结构是要一致的,当然Lucene是一种文档型的松散的存储结构,某个文档里也可以存储
自己特有的字段,而其他的文档里,则没有,不过既然是我们需要合并,那么就要求大多数的结构是要一致的,否则两个完全不同类型的索引,合并到一起也是不符
合逻辑的。
散仙为了演示合并,就建立了2份索引,然后对这两份索引进行合并。截图如下:
合并的核心代码如下:
<pre name="code" class="java">/***
* @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();
}
}</pre>
生成的第三份索引,截图如下:
下面我们来看下,合并前,1,2索引和合并后的3索引的数据变化信息。
<pre name="code" class="java"> System.out.println("==============1a=========================");
showAll("E:\\1\\a");
System.out.println("==============2a=========================");
showAll("E:\\2\\a");
System.out.println("==============合并后=========================");
showAll("E:\\3\\ab");</pre>
输出结果如下,注意里面有日期为null的,代表这个文档没有日期的这个字段。
<pre name="code" class="java">==============1a=========================
a===&gt;中国 日期: ===&gt; null
b===&gt;法国 日期: ===&gt; 1389783935597
c===&gt;中国 日期: ===&gt; null
d===&gt;英国 日期: ===&gt; null
==============2a=========================
q===&gt;中国 日期: ===&gt; null
w===&gt;法国 日期: ===&gt; 1389783980586
r===&gt;中国 日期: ===&gt; null
d===&gt;英国 日期: ===&gt; null
==============合并后=========================
a===&gt;中国 日期: ===&gt; null
b===&gt;法国 日期: ===&gt; 1389783935597
c===&gt;中国 日期: ===&gt; null
d===&gt;英国 日期: ===&gt; null
q===&gt;中国 日期: ===&gt; null
w===&gt;法国 日期: ===&gt; 1389783980586
r===&gt;中国 日期: ===&gt; null
d===&gt;英国 日期: ===&gt; null
</pre>
http://www.iteye.com/job/topic/1133159的更多相关文章
- HBase如何选取split point
hbase region split操作的一些细节,具体split步骤很多文档都有说明,本文主要关注regionserver如何选取split point 首先推荐web ui查看hbase regi ...
- jvm的代码缓存耗尽导致性能下降
在没遇到这个问题之前,我对JVM的解释模式与编译模式的代码性能相差有多大,是没有感觉的,只是觉得编译模式会比解释模式性能好那么一点点吧. 但是经历过这次以后,让我对JVM的即时编译产生了兴趣.先来看看 ...
- kill新号专题
一.在tomcat启动脚本中看到,kill -3
- javascript 解析dom字符串
知识要求:1:熟悉dom结构层次(如childNodes,nodeType,parent,children)等. 2:熟悉jq对象转换js 对象,反之 毕竟不是专业js人.借助第3方框架.其实jq也是 ...
- 关于Thread.getContextClassLoader的使用场景问题
Thread context class loader存在的目的主要是为了解决parent delegation机制下无法干净的解决的问题.假如有下述委派链: ClassLoader A -> ...
- JAVA 汇编语言查看
http://blog.csdn.net/bingduanlbd/article/details/8524300 http://hllvm.group.iteye.com/group/topic/34 ...
- Clr core
http://hllvm.group.iteye.com/group/topic/43559
- DisableExplicitGC和Direct ByteBuffer
直接堆外内存请参见:http://blog.csdn.net/lantian0802/article/details/39257087 JVM调优请参见:http://hllvm.group.itey ...
- 分析java程序中cpu占用过高的线程
http://blog.csdn.net/jgwei/article/details/12079147 http://hllvm.group.iteye.com/group/topic/38893 h ...
随机推荐
- velocity的宏
velocity中的宏macro的使用当中,由于velocity会将宏加载到tomcat中去,但是如果修改之后再加载的话velocity发现有了相同的宏名称,则不会加载 所以这时候的问题就是,在页面上 ...
- Openjudge-计算概论(A)-计算三角形面积
描述: 平面上有一个三角形,它的三个顶点坐标分别为(x1, y1), (x2, y2), (x3, y3),那么请问这个三角形的面积是多少. 输入输入仅一行,包括6个单精度浮点数,分别对应x1, y1 ...
- The server instance Witness rejected configure request; read its error log file for more information. The reason 1427, and state 31, can be of use for
数据库服务器做了镜像之后,发现有错误信息 The server instance Witness rejected configure request; read its error log file ...
- hdu 5524 二叉树找规律,二进制相关
input n 1<=n<=1e18 output 有n个结点的满二叉树有多少个不相同结点数的子树 做法:树有h=log2(n)层,最多有2h-2种(1除外),然后再n减去u重复的即可 # ...
- 《实战Java高并发程序设计》pdf
花了我五元大洋,需要的拿去吧.百度云盘:https://pan.baidu.com/s/1o8bESY2
- HDU - 2255 奔小康赚大钱(最大带权匹配)
Problem Description 传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子.这可是一件大事,关系到人民的住房问题啊.村里共有n间房间,刚好有n家老百姓, ...
- linux下修改MAC地址方法
一.修改MAC地址方法linux环境下:需要用 #ifconfig eth0 down 先把网卡禁用 再用ifconfig eth0 hw ether 1234567890ab 这样就可以改成功了要想 ...
- tar.gz tar.bz2 解压
从网络上下载到的源码包, 最常见的是 .tar.gz 包, 还有一部分是 .tar.bz2包 要解压很简单 : .tar.gz 格式解压为 tar -zxvf ...
- A*搜寻算法(A星算法)
A*搜寻算法[编辑] 维基百科,自由的百科全书 本条目需要补充更多来源.(2015年6月30日) 请协助添加多方面可靠来源以改善这篇条目,无法查证的内容可能会被提出异议而移除. A*搜索算法,俗称A星 ...
- td里的内容宽度自适应 及 鼠标放上显示标题div title
td里的内容自适应宽度, 用 width:100%控制 strRight+="<td bordercolor='#DEDEDE' width='500px' height='50px' ...