lucene_indexWriter说明、索引库优化

IndexWriter

Hibernate的SessionFactory
在Hibernate中。一般保持一个数据库就仅仅有一个SessionFactory。由于在SessionFactory中维护二级缓存,而SessionFactory又是线程安全的。

所以SessionFactory是共享的。

lucene的IndexWriter
假设同一时候在一个索引库中同一时候建立两个IndexWriter,比如:
		IndexWriter indexWriter = new IndexWriter(LuceneUtils.directory,LuceneUtils.analyzer,MaxFieldLength.LIMITED);IndexWriter indexWriter2 = new IndexWriter(LuceneUtils.directory,LuceneUtils.analyzer,MaxFieldLength.LIMITED);

这种代码会出现异常
而lucene的文件夹结构:

.会出现write.lock这个文件。

由于当一个IndexWriter在进行读索引库操作的时候,lucene会为索引库。以防止其它IndexWriter訪问索引库而导致数据不一致,直到IndexWriter关闭为止。

结论:同一个索引库仅仅能有一个IndexWriter进行操作。
封装IndexWriter的类LuceneIndexWriter 
public class LuceneIndexWriter {private static IndexWriter indexWriter = null;public static IndexWriter getIndexWriter() {if (indexWriter == null) {try {indexWriter = new IndexWriter(LuceneUtils.directory,LuceneUtils.analyzer, MaxFieldLength.LIMITED);} catch (CorruptIndexException e) {e.printStackTrace();} catch (LockObtainFailedException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}return indexWriter;}public static void close() {if (indexWriter != null) {try {indexWriter.close();} catch (CorruptIndexException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}} else {System.out.println("indexWriter为空。不能关闭!

"); } } }

注:这里用单例模式做比較好。
/*** 1、索引库的增、删、改是由indexWriter来操作的* 2、同一个时刻内。同一个索引库。仅仅能同意一个indexWriter操作* 3、当IndexWriter创建完毕以后。indexwriter所指向的索引库就被占据了,仅仅有当indexWriter.close时。才干释放锁的资源* 4、当一个新的indexWriter想拥有索引库时。原来的indexWriter必须释放锁* 5、仅仅要索引库中存在write.lock文件。说明上锁了* 6、indexWriter.close有两层含义:*     *  关闭IO资源*     *  释放锁* @author Administrator**/
public class IndexWriterTest {@Testpublic void testIndexWriter() throws Exception{IndexWriter indexWriter = new IndexWriter(LuceneUtils.directory,LuceneUtils.analyzer,MaxFieldLength.LIMITED);indexWriter.close();IndexWriter indexWriter2 = new IndexWriter(LuceneUtils.directory,LuceneUtils.analyzer,MaxFieldLength.LIMITED);}
}

索引库的优化

当运行创建索引多次时。索引库的文件如图所看到的:(索引里内容是一样的)
从图中能够看出来,每运行一次就生成一个cfs文件。当运行delete操作时,会生成如图所看到的的结构:


从图中能够看出来。lucene在运行删除的时候,是先把要删除的元素形成了一个文件del文件,然后再和cfs文件进行整合得出最后结果。
结论:假设添加、删除重复操作非常多次,就会造成文件大量添加。这样检索的速度也会下降。所以我们有必要去优化索引结构。使文件的结构发生改变从而提高效率。

手动合并文件

合并多个小文件为一个大文件,降低IO操作:
在indexWriter.close();前加上
indexWriter.optimize();
就可以
在运行完上述代码后,索引库的结构为:
能够看出把该合并的项都合并了。把del文件彻底所有删除掉了。


自己主动合并文件

indexWriter.setMergeFactor(3);

当cfs文件的数量为3个时,这是会自己主动合并成一个文件。
假设没有设置数量,默认情况下为10;

转载于:https://www.cnblogs.com/blfshiye/p/5272222.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/357532.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

600W个微信红包封面,人人都能领取到!!!

过年啦,祝大家春节快乐牛年大吉,万事如意!别忘了春节还有红包封面领取新的一年愿大家财运亨通!新年过完了,整理情绪上班了,祝福没有断,问候也依然。努力工作多表现,年后年终奖永远把…

android 二次绘制 layout,View的三次measure,两次layout和一次draw

我在《Android视图结构》这篇文章中已经描述了Activity,Window和View在视图架构方面的关系。前天,我突然想到为什么在setContentView中能够调用findViewById函数?View那时不是还没有被加载,测量,布局和绘制啊。然后就搜索了相关的…

盘点关于程序员的那些经典案例

深度剖析几个经典话题,以图文的形式展现,好好看图。 目录 1. 2014互联网职场薪酬报告!你拖后腿了吗? 2. 月薪8K程序员现身说法:男人就该默默做技术! 3.项目建设 4. 2014年亿级用户下的新浪微博平台架构…

html中文字过长 自动隐藏,css 实现文字过长自动隐藏功能

单行overflow: hidden;text-overflow: ellipsis;white-space: nowrap;多行(兼容各个浏览器)//通过覆盖最后几个字的形式p{position:relative;line-height:1.4em;height:4.2em;/* 3 倍line-height 多少倍就是多少行*/overflow:hidden;}.p::after {content:"...";font-…

使用Xtext为Eclipse和IntelliJ开发DSL

在这篇文章中,我们将看到如何开发一种简单的语言。 我们的目标是: 语言的解析器 IntelliJ的编辑器 。 编辑器应具有语法突出显示,验证和自动完成功能 我们还将免费提供Eclipse和Web编辑器的编辑器 ,但请包含您的兴奋之处&#…

搬家后第一次缴电费,查询客户编号的解决办法

最近搬家后,发现家里停电了,不知道客户编号,想通过支付宝生活缴费模块充值。 解决办法。 1.走到电表跟前,连续按下电表白色按钮4-5下。会出现一个四位数的阿拉伯数字。比如:0088。取,后两位88。 2.再按一下…

html字符实体标签语法,HTML字符实体与文本格式化标签

HT环行进端处触码通法果泉位可近境其行框理发ML 字符实体/HTML 中的预留字符必须被替换为字符实体,一些在键盘上找不到的字符也可以使用字符实体来览页些求时是过解些这确如目前例总站回广随能4果泉时标配使能幻近器面实的我是接,前些模小架端如结的事告机对8和水兼…

ArcGIS API for Silverlight地图加载众多点时,使用Clusterer解决重叠问题

ArcGIS API for Silverlight地图加载众多点时,使用Clusterer解决重叠问题 原文:ArcGIS API for Silverlight地图加载众多点时,使用Clusterer解决重叠问题 问题:如果在地图上加载成百上千工程点时,会密密麻麻,外观不是很…

html 文本框 自动拼接,HTML 中table的结构以及拼接

表格基本上有如下几个标签构成:(1).(2).标签用来创建表格的行。(3).标签用来创建表头单元格。 t-head(4).标签用来创建tr行中的单元格。(5).标签用来创建标题。(6).标签用来创建表格的表头。 (一个table只能有一个)(7).标签用来创建表格的主体部分。(8).标签用来创建表格的页…

谈谈JAVA工程狮面试中经常遇到的面试题目------什么是MVC设计模式

作为一名java工程狮,大家肯定经历过很多面试,但每次几乎都会被问到什么是MVC设计模式,你是怎么理解MVC的类似这样的一系列关于MVC的问题。 【出现频率】 【关键考点】 MVC的含义MVC的结构 【考题分析】  在java Web开发中,存在两…

mvc 一般注释_使用带有注释和JQuery的Spring MVC 3的Ajax

mvc 一般注释与Ajax一起工作对我来说一直很有趣! 是不是 ? 我将使您轻松将Ajax与Spring MVC 3和JQuery结合使用。 这篇文章将向您说明如何在工业编码的现实生活中使用Ajax。 和往常一样,我们将在Spring MVC 3框架中以Ajax的实际示例为例&…

html中el表达式遍历list,EL表达式在JS中取出来打印[object HTMLDivElement]的问题

今天做项目的时候,要在JS中获取请求参数中的 值,想直接用 ${param.tabName}获取,结果console.debug()打印出来,居然是 [object HTMLDivElement] 类型. 导致无法获取真正的值,原因可能是因为JQ默认把 这个值进行了封装,封装成 HTMLDivElement 对象,导致出问题. 解决办法,就是告…

孙叫兽:我所认为的领导力!

回归领导力的本质,观察反思自己日常的领导力行为,在不断的学习中找到属于自己的最佳答案... 目录 重塑领导力 管理,到底是管人还是管事? 领导力唯一的准则是没有准则 改变自己就能改变公司? 成功的战略10%制定90%执…

WildFly管理控制台已更新–请求反馈

红帽JBoss企业应用程序平台(EAP)和WildFly具有共生关系 。 简而言之,红帽JBoss企业应用程序平台(JBoss EAP)保留了WildFly社区项目(以前称为JBoss Application Server)的所有创新。 但是只有JBo…

win7远程多用户登录此计算机无法,win7如何实现远程桌面多用户登录|win7实现多用户登录远程桌面的方法...

Win7系统自带有远程桌面功能,开启远程桌面可以控制其他电脑,一般远程登录桌面时,即使登录的是不同的管理账号,还是会把远程登录的人给记下来,不同的账号只能同时存在一个会话窗。那么win7如何实现远程桌面多用户登录&a…

饿了么薅羊毛时刻正式开启

随着信息化时代的来临,我们的生活方式更加的方便快捷。随着外卖行业的发展,我们不用踏出家门就可以吃到热乎的饭菜了。我们网上点餐都是通过外卖app来进行点餐的,现在的外卖app主要要饿了么、美团外卖等等。有时候外卖平台也会推出一些优惠活…

软件测试 实验一

一、Junit, hamcrest 和 eclemma 的安装和使用 通过右击项目里build path 里的 add external archives...来添加Junit包和hamcrest包。运行Junit时,只需在测试用例上右击run as->Junit test,即可对要测试的函数进行测试。 eclemma压缩包我是通过在线安…

如何开发高度可定制的产品

您是否听说过:“我们非常喜欢您的产品……除了一些小细节”。 然后,CIO推出了一系列其他“必备”要求的清单,其中有数百个要求添加到您的惊人产品中。 您是否听说过,甚至说过:“团队,我们即将签署一份利润丰…

前端使用正则表达式从接口地址栏取值并将对应的值展示在页面上

业务场景,APP分享出链接,通过get请求接口方式,展示对应的字段。 需求图: 获取某单号 var name"";//姓名var idNo"";//证件号var applicationNogetParams("applicationNo");//号码window.onload fu…

科学计算机看电量,解密:关于手机电量为1%是如何科学的算出来的?

本文的话题也许是很多人的疑问,对于手机显示电量是怎么推算出来的,到底显示1%的时候还有没有电呢?这是一个直击灵魂的问题——有时候手机最后1%的电能用很久,有时候却只能用一瞬间。给人留下这个印象,有一些心理层面的…