Lucene.Net:关于索引的一些补充说明和总结

在前面的几篇关于lucene的文章中,我已经简要说明了如何利用lucene进行分词、索引和搜索。最近大部分时间耗在查资料上,看得比较多比较杂但是一贯的不够深入,还好多数都是不会影响编程实践的概念性的东西。有时候我自己也感觉到有心无力,太关注那些表面的繁文缛节性的东西有让人失掉好奇、激情和勤奋实践的风险,毕竟我个人需要专心专注的事情是解决问题而不是多知道几个概念和专业名词,要先做出东西来,虽然这样显得不是很专业。本文简单补充记录一下对于lucene创建索引有用的几个参数以及索引文件中的常见的几种格式的感性认识和总结,希望对你也有帮助。

一、提高索引速度几个有用的参数

在索引算法确定的情况下,最为影响lucene索引速度的主要是三个参数,即IndexWriter中的 mergeFactor, maxMergeDocs和RAMBufferSizeMB 。这些参数主要就是控制内外存交换和索引合并频率,从而达到提高索引速度的目的,当然这几个参数的具体设定和机器的硬件条件也密不可分。

1、mergeFactor

mergeFactor就是所谓的“合并因子”,它的作用主要是用于子索引(segment)合并的。 如你所知,lucene中索引总体上是这样进行的:索引先写入内存,触发一定限制条件后写入硬盘,生成一个独立的子索引(segment)。通常情况下,多个子索引在优化(optimize())后会合并成一个索引,否则子索引会很多,影响检索速度,而且占用的磁盘空间可能会非常大。mergeFactor这个参数就是控制当硬盘中有多少个子索引segments时,lucene就需要把这些子索引合并成一个较大一点的索引。合并的内部实现细节我也不是很清楚,但是lucene 中默认索引合并机制并不是两两合并,通常都是多个segment一次合并成一个较大索引,所以mergeFactor越大耗费内存越多,索引速度也会快些。

            IndexWriter writer = new IndexWriter(directory, analyzer, true, IndexWriter.MaxFieldLength.LIMITED);Console.WriteLine(writer.GetMergeFactor());//mergeFactor默认是10writer.SetMergeFactor(30);Console.WriteLine(writer.GetMergeFactor());//设置后,当前是30

mergeFactor默认值是10,您可以自己设置合理的合并因子的值来加快构造索引。

2、maxMergeDocs

合并因子mergeFactor是从segment优化性能入手,而maxMergeDocs,看命名就知道是从构成子索引(segment)的文档(document)着手提升性能。 maxMergeDocs参数决定写入内存索引文档(document)的个数,到达该数目后就把该内存索引写入硬盘,生成一个新的子索引segment文件,所以该参数也就相当于一个内存buffer,一般来说越大索引速度越快。

需要注意的是,maxBufferedDocs这个参数默认是disabled的,因为lucene中还用另外一个参数(RAMBufferSizeMB)控制这个bufffer的索引文档个数。其实maxBufferedDocs和RAMBufferSizeMB这两个参数是可以一起使用的,一起使用时只要有一个触发条件满足就写入硬盘,生成一个新的子索引segment文件。
 

            IndexWriter writer = new IndexWriter(directory, analyzer, true, IndexWriter.MaxFieldLength.LIMITED);Console.WriteLine(writer.GetMaxMergeDocs());//MaxMergeDocs默认值是2147483647 (也即int.MaxValue)writer.SetMaxMergeDocs(1024);Console.WriteLine(writer.GetMaxMergeDocs());//设置后,当前是1024

maxMergeDocs默认值是常量int.MaxValue(2147483647)。

3、RAMBufferSizeMB

如你所知,这个参数作用类似于maxMergeDocs,控制用于缓存索引文档的内存上限。如果buffer的索引文档个数到达该上限就写入硬盘。一般来说该参数越大,占用内存越大,索引速度也就越快。

            IndexWriter writer = new IndexWriter(directory, analyzer, true, IndexWriter.MaxFieldLength.LIMITED);Console.WriteLine(writer.GetRAMBufferSizeMB());//RAMBufferSizeMB默认值是16 writer.SetRAMBufferSizeMB(1024);Console.WriteLine(writer.GetRAMBufferSizeMB());//设置后,当前是1024

RAMBufferSizeMB默认值是16.

小结:通过上述分析说明,我们知道,合理设置三个参数的值,可以充分利用内存(理论上,参数值越大,内存利用越充分,但是必须和实际的机器性能相结合),避免频繁的IO操作,提升索引速度。

二、关于索引文件的几种常见格式

这里我主要参考了觉先的这一篇和这一篇非常耐心详细的两篇好文章。虽然收藏已久,但是直到现在自己还没有完全搞明白各个文件之间的关系。现在看来,依然醍醐灌顶很有收获。态度决定一切,有时间我会重新写一篇更详细透彻的学习笔记。下面重点记录一下对我自己的实际编程有帮助的几个文件格式。

1、.gen格式和segments_N

每个segment代表lucene的一个完整索引段,建立索引后必须存在的一个文件。一个索引(Index)可以同时存在多个segments_N。当我们要打开一个索引的时候,我们必须要选择一个segments_N文件来打开。在打开索引选择某个segments_N文件时,segments.gen文件和segments_N的N(Generation)的确定就有密切关系(具体逻辑可以参考这篇的4.1.1)。

2、.cfs格式

即复合索引文件格式。我们知道,索引的内容可能非常大,文件数量也可能非常多。如果遇到这种情况,系统打开文件的数量将很大,会极大地耗费系统资源。因此,lucene提供了一个单文件索引格式,也就是所谓的复合索引格式。使用复合索引格式存储Document内容时,只需要在初始化完成一个IndexWriter对象后,使用SetUseCompoundFile(boolean)方法,在设置UseCompoundFile为true后,就会有这个文件。

            IndexWriter writer = new IndexWriter(directory, analyzer, true, IndexWriter.MaxFieldLength.LIMITED);Console.WriteLine(writer.GetUseCompoundFile());//默认为truewriter.SetUseCompoundFile(false);Console.WriteLine(writer.GetUseCompoundFile());

默认情况下,IndexWriter将UseCompoundFile置为True。

 

3、.lock格式

顾名思义,.lock就是锁文件类型了。对于普通优化后的索引文件,这个锁文件是看不到的。当我们通过IndexWriter或者IndexModifier对索引文件进行插入、修改或者删除操作的时候,都会生成一个.lock的锁文件。在lucene旧版本的类库中,通过多线程进行索引更改等操作,很容易发生异常,通常情况下都是由于该锁文件。提到了锁机制,我们有必要了解一下lucene的并发性规则:

操作是否允许
对同一个索引运行多个并行的搜索进程
对一个正在生成、被优化或正在与另一索引合并的索引运行多个并行的搜索进程,或该索引正在进行删除、更新文档等操作时,对索引运行多个并行的搜索进程
对同一个索引用多个IndexWriter对象执行添加、更新文档的操作
当一个从索引中删除文档的IndexReader对象没有成功关闭时,打开一个IndexWriter对象用于在这个索引中添加新的文档
IndexWriter对象向索引中添加新文档后,未成功关闭;在此之后,打开一个IndexReader对象用于从这个索引中删除文档

我们可以看到这种并发性规则对于搜索是毫无限制的,但是索引的其他操作可能会对搜索产生影响,比如更新后还没有优化的索引可能影响搜索速度,搜索的准确性也不可靠。好在我们的实际项目中都会有一定的策略来使用索引,比如相同的索引复制两份,一份专门用来搜索,一份用来增删改和优化,然后定时切换。

3、.fnm格式

包含 Document中所有Field名称。

4、.fdx和.fdt格式

.fdt文件用于存储具有 Field.Store.YES属性的field的数据的相关信息。而.fdx类型文件则是一个索引,用于存储域的信息。

5、.tii和.tis格式

.tii存储分词后term的索引文件,标明了每个.tis文件中词条的位置。

6、deletable格式

在lucene的索引中,所有的文档被删除后并不是立刻从索引中去除,而是留待下次合并索引或对索引进行优化时才真正删除。这种功能是通过deletable文件实现的。所有的文档在被删除后,会首先在deletable文件中留一个记录,要真正删除时,才将索引除去。

最后附上一张流传于网上的简明图片说明一下常见的索引及其文件格式的关系:

lucene_file_format

其他参考文章:

http://lucene.apache.org/java/2_9_2/fileformats.html

转载于:https://www.cnblogs.com/jeffwongishandsome/archive/2011/02/11/lucenet-net-explanation.html

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

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

相关文章

在2008 server安装vm server时发生的错误error1718、error1335……

;转载于:https://www.cnblogs.com/minglog/archive/2011/02/15/1955290.html

hibernate3.6.0日志配置

hibernate3 自带的默认的日志框架是slf4j,hibernate3的slf只是一个日志的接口,而hibernate3 自带默认的日志框架,在实际开发中很少有公司或者是项目中用到,这里记录一种使用log4j的日志框架来代替slf4j日志框架的实现,…

android stackview,Android StackView 使用示例

cell.xml 布局文件:xmlns:android"http://schemas.android.com/apk/res/android"android:id"id/cellImage"android:layout_width"200dp"android:layout_height"200dp"/>主布局文件:android:id"id/activ…

WCF 体系结构图

转载于:https://www.cnblogs.com/agressivo/articles/1958858.html

android studio电影院选座,8排电影院选座最佳位置

8排电影院选座最佳位置在哪里呢?8排电影院属于小影厅,小影厅银幕宽度在10米以下,座位100以内,座位排数通常拥有8-14排,小影厅整体空间小,选座时要选中间稍靠后一些的位置。由于整体排数少,因此选…

仿Jquery链式操作的xml操作类

经常需要对xml文件进行操作&#xff0c;参考了Jquery的链式操作后实现了xmlHelper类。代码usingSystem;usingSystem.Data;usingSystem.Configuration;usingSystem.Xml;namespaceConfigUpdate{ ///<summary>///调用非静态的操作方法的 ///</summary>publiccla…

4月17日鸿蒙开发者大会,4月17日这天,将载入华为史册

文/笨鸟原创不易&#xff0c;禁止抄袭、洗稿&#xff0c;违者必究&#xff01;万众瞩目的华为鸿蒙系统对于国人来说&#xff0c;一部智能手机只有实现了芯片和系统技术的自主化&#xff0c;才能被称之为真正的国产手机。而就目前的国内手机市场而言&#xff0c;除华为之外的所有…

html仿手机界面,javascript新手实例3-仿手机聊天界面(if else运用)

今天给大家一个if else的Javascript小示例&#xff0c;其中我在js文件里写了很多注释&#xff0c;有兴趣的同学自己看注释&#xff0c;另外对于聊天界面的显示方式&#xff0c;我写了两种&#xff0c;大家也可以分别试试&#xff1a;老规矩&#xff0c;先上图&#xff1a;html代…

LeetCode 1457. 二叉树中的伪回文路径(位运算+递归)

1. 题目 给你一棵二叉树&#xff0c;每个节点的值为 1 到 9 。我们称二叉树中的一条路径是 「伪回文」的&#xff0c;当它满足&#xff1a;路径经过的所有节点值的排列中&#xff0c;存在一个回文序列。 请你返回从根到叶子节点的所有路径中 伪回文 路径的数目。 示例 1&…

LeetCode 837. 新21点(动态规划)

文章目录1. 题目2. 解题2.1 暴力超时2.2 优化1. 题目 爱丽丝参与一个大致基于纸牌游戏 “21点” 规则的游戏&#xff0c;描述如下&#xff1a; 爱丽丝以 0 分开始&#xff0c;并在她的得分少于 K 分时抽取数字。 抽取时&#xff0c;她从 [1, W] 的范围中随机获得一个整数作为…

计算机网络划分的标准,计算机网络基础

1.具有统一的网络体系结构、遵循国际标准化协议的计算机网络在第三代网络出现以前各厂家为了霸占市场采用自己独特的技术并开发了自己的网络体系结构网络无法实现不同厂家设备互连这样就阻碍了大范围网络的发展。后来为了实现网络大范围的发展和不同厂家设备的互连1977年国际标…

大型软件是否占用计算机内存,电脑系统开机内存占用多少正常

原标题&#xff1a;电脑系统开机内存占用多少正常正常情况下有多少启动内存&#xff1f;如果使用2G内存&#xff0c;则Win7在启动时基本上可以达到50&#xff05;以上&#xff0c;运行点程序肯定会达到80&#xff05;&#xff0c;这是正常的。如果使用4G内存&#xff0c;则Win7…

LeetCode 1267. 统计参与通信的服务器(计数)

1. 题目 这里有一幅服务器分布图&#xff0c;服务器的位置标识在 m * n 的整数矩阵网格 grid 中&#xff0c;1 表示单元格上有服务器&#xff0c;0 表示没有。 如果两台服务器位于同一行或者同一列&#xff0c;我们就认为它们之间可以进行通信。 请你统计并返回能够与至少一…

Informix IDS 11系统料理(918查验)认证指南,第 4 部分: 功能调优(5)

更新统计信息的调优IDS 使用基于本钱的优化器&#xff1a;当优化器确定盘诘规画时&#xff0c;它为每个可以的规画付与一个本钱&#xff0c;然后选择本钱最低的规画。下面是优化器用于确定每个盘诘规画的本钱的一些要素&#xff1a;与每个文件系统会见相干的 I/O 请求的数目 确…

Yakuake 2.8 beta1

Toy Posted in AppsRSSTrackback Yakuake 这个终端模拟器我们已经批评过&#xff0c;它可以将一些异常不错的下场融入到你的终端体验中。本日&#xff0c;该办法推出了 2.8 beta1 版&#xff0c;新增了皮肤经管、全屏情势、以及可将会话别离到多个终端窗口等功用。- Download Y…

怎样用计算机添加文章标题,计算机论文题目怎么定-易指做帮写网

1.相关理论基础分析1.1宠物救助系统理论阐述在很多区域&#xff0c;猫和狗等小动物均处于一种散养的状态&#xff0c;这样一来就使其成为流浪动物&#xff0c;无家可归&#xff0c;在城市的街道上游走。此外&#xff0c;由于流浪猫狗的繁衍速度较快&#xff0c;壮大流浪动物的群…

LeetCode 390. 消除游戏(类似约瑟夫环,找映射规律)

1. 题目 给定一个从1 到 n 排序的整数列表。 首先&#xff0c;从左到右&#xff0c;从第一个数字开始&#xff0c;每隔一个数字进行删除&#xff0c;直到列表的末尾。 第二步&#xff0c;在剩下的数字中&#xff0c;从右到左&#xff0c;从倒数第一个数字开始&#xff0c;每隔…

四川大学计算机学院挑战杯,“挑战杯”四川大学2018-2019年大学生课外学术科技作品竞赛决赛答辩举行...

3月22日下午&#xff0c;“挑战杯”四川大学2018-2019年大学生课外学术科技作品竞赛决赛答辩在望江基础教学楼A座顺利举行。从校赛报名阶段的263支队伍中脱颖而出的108支团队进行了现场PPT陈述和评委问辨。参赛项目包括科技发明类、自然科学论文类、社会哲学调查报告类作品。评…

LeetCode 519. 随机翻转矩阵(哈希)

1. 题目 题中给出一个 n_rows 行 n_cols 列的二维矩阵&#xff0c;且所有值被初始化为 0。 要求编写一个 flip 函数&#xff0c;均匀随机的将矩阵中的 0 变为 1&#xff0c;并返回该值的位置下标 [row_id,col_id]&#xff1b; 同样编写一个 reset 函数&#xff0c;将所有的值都…

迪士尼手机官方专卖东家京破产

迪士尼手机业务一向都在不时的展开&#xff0c;迪士尼品牌各种周边主题手机掉掉了MM们的喜好。上个月脱手脱手&#xff0c;迪士尼在日本推出了特别版的Android智好手机&#xff0c;并举办了大面积的电视告白推行&#xff0c;昨天迪士尼挪动在东京市中心开放了他们的官方实体专…