文档章节

lucene4.7 锁机制(十)

一枚Sir
 一枚Sir
发布于 2014/04/11 11:13
字数 1001
阅读 255
收藏 0

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

即使是限定Lucen只能使用一个线程进行写入操作,Lucene的写入性能也是非常高效的,特别是在Lucene4.x之后,更是优异,我们可以根据自己服务器的硬件环境,来调优一些参数,利用上批处理的特性,可以大大提升写入性能。 

前面说过,Lucene写入时只能用一个线程操作,那么假如我们想使用多线程写入来提速可以吗? 
答案是肯定的,虽然Lucene限定只能用一个线程写入,但是这个限制仅仅指的是对一个索引文件的限制,我们可以采取一种折中的方式,利用多个线程写入多个索引文件夹目录,最后在对这几个索引文件合并,由此来提升索引速度,Lucene的API也支持多个索引文件的合并,所以采用这种方式来建索引,也能够大大的提升索引性能,这种方式尤其适用于对数据库的数据建索引,我们可以采用分页读的方式,由某个固定数目的线程来建索引。 

本篇就来介绍下,如何使用LuceneD的API 来对多个索引文件进行合并操作,合并操作大多数时候要求我们的数据结构是要一致的,当然Lucene是一种文档型的松散的存储结构,某个文档里也可以存储自己特有的字段,而其他的文档里,则没有,不过既然是我们需要合并,那么就要求大多数的结构是要一致的,否则两个完全不同类型的索引,合并到一起也是不符合逻辑的。 


为了演示合并,就建立了2份索引,然后对这两份索引进行合并。截图如下:

合并的核心代码如下:

/***
     * @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索引的数据变化信息。

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

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

==============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

© 著作权归作者所有

一枚Sir
粉丝 119
博文 209
码字总数 350904
作品 0
朝阳
架构师
私信 提问
Lucene4.7 Directory (一)

散仙今天就从源码的角度来分析下Lucene的根基Directory的实现,在此之前,我们先来看下Directory家族的层级分布图。 从上图中,我们可以看出Directory共有11个直接或者间接的子类,不同的子类...

一枚Sir
2014/04/11
552
0
lucene4下用MultiFieldQueryParser同时搜索多个field时

因为工作中突然要用到lucene,就到官网上下了lucene4.7的jar包和文档,回头开始学习的时候才发现,网上lucene相关的资料大部分都停留在3.*阶段,于是结合前辈的代码,自己写了下面一个例子,...

一枚Sir
2014/04/10
7.1K
1
lucene4.7 索引文件(九)

下图是一个典型的Lucene4.x的索引结构图: Lucene4.x之后的所有索引格式如下所示: 文件名 后缀 描述 Segments File segments.gen, segments_N 存储段文件的提交点信息 Lock File write.lock...

一枚Sir
2014/04/11
3K
1
Lucene4.7如何遍历索引获得每个词的docFreq,IndexReader没有terms()方法了

Lucene4.7如何遍历索引获得每个词的docFreq,IndexReader没有terms()方法了

_Roger_
2014/03/14
269
0
lucene4.7删除索引失败

我使用的是lucene4.7 两个问题: 1 更新索引时不会在原基础上更新,会新增一条。 2 删除索引时删除不掉。 创建IndexWriter的方法 把数据库对象生成索引的方法: 其中LuceneAppUtils是一个工具...

小Y_
2014/06/05
1K
6

没有更多内容

加载失败,请刷新页面

加载更多

golang-字符串-地址分析

demo package mainimport "fmt"func main() {str := "map.baidu.com"fmt.Println(&str, str)str = str[0:5]fmt.Println(&str, str)str = "abc"fmt.Println(&s......

李琼涛
今天
4
0
Spring Boot WebFlux 增删改查完整实战 demo

03:WebFlux Web CRUD 实践 前言 上一篇基于功能性端点去创建一个简单服务,实现了 Hello 。这一篇用 Spring Boot WebFlux 的注解控制层技术创建一个 CRUD WebFlux 应用,让开发更方便。这里...

泥瓦匠BYSocket
今天
6
0
从0开始学FreeRTOS-(列表与列表项)-3

FreeRTOS列表&列表项的源码解读 第一次看列表与列表项的时候,感觉很像是链表,虽然我自己的链表也不太会,但是就是感觉很像。 在FreeRTOS中,列表与列表项使用得非常多,是FreeRTOS的一个数...

杰杰1号
今天
8
0
Java反射

Java 反射 反射是框架设计的灵魂(使用的前提条件:必须先得到代表的字节码的 Class,Class 类 用于表示.class 文件(字节码)) 一、反射的概述 定义:JAVA 反射机制是在运行状态中,对于任...

zzz1122334
今天
6
0
聊聊nacos的LocalConfigInfoProcessor

序 本文主要研究一下nacos的LocalConfigInfoProcessor LocalConfigInfoProcessor nacos-1.1.3/client/src/main/java/com/alibaba/nacos/client/config/impl/LocalConfigInfoProcessor.java p......

go4it
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部