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===>中国  日期: ===> 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

</pre>

http://www.iteye.com/job/topic/1133159的更多相关文章

  1. HBase如何选取split point

    hbase region split操作的一些细节,具体split步骤很多文档都有说明,本文主要关注regionserver如何选取split point 首先推荐web ui查看hbase regi ...

  2. jvm的代码缓存耗尽导致性能下降

    在没遇到这个问题之前,我对JVM的解释模式与编译模式的代码性能相差有多大,是没有感觉的,只是觉得编译模式会比解释模式性能好那么一点点吧. 但是经历过这次以后,让我对JVM的即时编译产生了兴趣.先来看看 ...

  3. kill新号专题

    一.在tomcat启动脚本中看到,kill  -3

  4. javascript 解析dom字符串

    知识要求:1:熟悉dom结构层次(如childNodes,nodeType,parent,children)等. 2:熟悉jq对象转换js 对象,反之 毕竟不是专业js人.借助第3方框架.其实jq也是 ...

  5. 关于Thread.getContextClassLoader的使用场景问题

    Thread context class loader存在的目的主要是为了解决parent delegation机制下无法干净的解决的问题.假如有下述委派链: ClassLoader A -> ...

  6. JAVA 汇编语言查看

    http://blog.csdn.net/bingduanlbd/article/details/8524300 http://hllvm.group.iteye.com/group/topic/34 ...

  7. Clr core

    http://hllvm.group.iteye.com/group/topic/43559

  8. DisableExplicitGC和Direct ByteBuffer

    直接堆外内存请参见:http://blog.csdn.net/lantian0802/article/details/39257087 JVM调优请参见:http://hllvm.group.itey ...

  9. 分析java程序中cpu占用过高的线程

    http://blog.csdn.net/jgwei/article/details/12079147 http://hllvm.group.iteye.com/group/topic/38893 h ...

随机推荐

  1. Hanoi汉诺塔问题——递归与函数自调用算法

    题目描述 Description 有N个圆盘,依半径大小(半径都不同),自下而上套在A柱上,每次只允许移动最上面一个盘子到另外的柱子上去(除A柱外,还有B柱和C柱,开始时这两个柱子上无盘子),但绝不允 ...

  2. ZIP文件解压

    public class DZip { /// <summary> /// 压缩为ZIP文件 /// </summary> public void Zip(string dir ...

  3. XCode debug中添加查找debug和控制台的办法

    我们每一次编码完成后紧接着便是编译运行起来,看看程序运行的结果是否达到了我们的预期,此时,我们离不开控制台给我们输出必要的信息,为此, 当程序跑起来时,我们的控制台遍自己弹出来,这是不是蛮好的?  又 ...

  4. 正确使用Core Data多线程的3种方式

    在#Pragma Conference 2015会议上,Marcus Zarra,撰写过关于Core Data和Core Animation的书,叙述了三种在多线程环境下使用Core Data的方法并 ...

  5. html5+css3学习笔记音频和视频

    格式 IE Firefox Opera Chrome Safari Ogg No 3.5+ 10.5+ 5.0+ No MPEG 4 9.0+ No No 5.0+ 3.0+ WebM No 4.0+ ...

  6. MFC下MCI的使用播放音乐

    最近研究了一下MFC下的音乐的播放,主要使用了MCI 1.需要包含的库文件 在链接资源里(link)添加库文件VFW32.lib winmm.lib 2.包含的头文件 #include <mms ...

  7. php学习的第8天

    晚上老师布置啦17题算数问题的作业 我一看 感觉挺容易的 动手就开始做啦起来 不知不觉也9点多啊 终于做好前部题目 发现这我3个月前也遇到类似的题目 那是我还一题都做一题用上1个钟左右 好多也做不出 ...

  8. Cenots安装openvpn、pam_mysql进行用户认证和流量控制

    一.安装Centos6.5 二.修改YUM仓库 1. 默认仓库不能访问部分软件包,因此我们需要修改YUM仓库 cd /etc/yum.repos.d #备份 mv ./CentOS-Base.repo ...

  9. iOS开发 自定义UIAlertController的样式

    引言: 关于提示框, 系统自带的提示框有时可能满足不了我们的需求, 比如一个提示框的取消按钮我需要灰色字体显示, 这时候就需要自定义提示框的样式了. 示例图 苹果自iOS8开始,就已经废弃了之前用于界 ...

  10. wordpress建站过程2——结构

    开始wordpress之前,我们需要了解,wordpress的结构和调用方式. 当一个wordpress开始之后,他会读取[当前主题]的index.php.所以一旦主题切换了,它读的就是其他主题的in ...