IndexReader关闭的问题

实时搜索设计开发中,IndexReader在饮用计数变为0时调用doClose,而SegmentReader则有一个addCoreClosedListener方法控制在SegmentCoreReaders关闭时的操作,搜索Lucene的代码只有在FieldCacheImpl中看到调用,其中的回调>是让SegmentCoreReaders关闭之后从field cache中删除field cache。

查看Lucene core 4.0的代码,使用的FieldCache只有Field Comparator,FieldCacheRangeFilter,FieldValueFilter等,看起来如果完全基于docvalues做排序和filter,不需要考虑。

另外如果考虑的话,filed cache基于docId,所以内存索引快照并不需要每个都对应一个field cache,只要映射到最新的field cache即可,只要读取时不逾越max doc id即可。因此RamIndexReader.getCoreCacheKey返回对应RamIndexWriter即可。

另外,SegmentCoreReaders的关闭文件句柄操作时IOUtils.close(termVectorsLocal, fieldsReaderLocal,...)。

实时搜索时每个IndexSearcher都需要关闭其Reader的,这样在重复打开时不会有遗漏的文件句柄。

要真正释放资源,应该在new新的实时搜索searcher时不操作(new时自动有一个引用计数了),在searcher替换时调用旧Reader的decRef方法。

搜索前调用一次incRef,搜索完成调用一次decRef。

具体到内存索引Reader,其doClose可以什么都不做。

RealTimeIndexWriter的close,分别调用RamIndexWriter的close方法,SegmentReaderAndLiveDocs的close方法。SegmentReaderAndLiveDocs内部有一个实时的SegmentReader,它也要Close。每次快照生成的SegmentReader共用一个core。ConcreateCompositeReader incRef和decRef时应该对下面的所有AtomicReader操作。

这种手动的incRef,decRef方法比较笨,而且容易出错,如果用Java7可以直接使用AutoClosable.

IndexReader关闭的问题

时间: 2024-10-06 17:34:17

IndexReader关闭的问题的相关文章

IndexReader已解决的问题

设计和实时搜索的发展,IndexReader饮酒数成为0当调用doClose,和SegmentReader再有一个addCoreClosedListener控制的方法SegmentCoreReaders当操作接近.搜索Lucene该代码只有在FieldCacheImpl见电话,的回调>是让SegmentCoreReaders关闭之后从field cache中删除field cache. 查看Lucene core 4.0的代码,使用的FieldCache仅仅有Field Comparator,F

lucene的IndexReader的初始化过程

在使用Lucene时,有一条建议"不要频繁去打开关闭硬盘索引".为什么会有这条建议?这就需要在IndexReader的实例化过程中找答案.先说一个结论"IndexReader的实例化过程是一个非常耗时的过程".由于IndexReader只是一个抽象类,在调用代码: 真正得到的是StandardDirectoryReader对象.首先来看一下StandardDirectoryReader的类图: 最重要的一个类就是SegmentCoreReader,它关联着整个seg

indexReader的设计

在indexReader和indexSearch中,如果频繁的去打开索引或者关闭索引,对资源的消耗比较大.所以一般采用单利的模式进行对indexReader的打开. 在indexReader的开发情景中,例如在一个查询的过程中,然后search的线程睡眠十分钟,然后在十分钟之间进行了索引的更新writer.delete(docu)(删除一个索引库中的索引).但是此时如果继续读索引,它读到的还是旧的数据,并没有读到被修改后的索引库,只有在重新打开reader的时候才会读取到更新后的数据.在关闭资源

IndexReader和IndexWriter的生命周期

http://youyang-java.iteye.com/blog/1731205 对于IndexReader而言,反复使用 IndexReader .open打开会有很大的开销,所以一般在整个程序的生命周期中只会打开一个IndexReader,通过这个IndexReader来创建不同的IndexSearcher,如果使用单例模式,可能出现的问题有:1.当使用Writer修改了索引之后不会更新信息,所以需要使用IndexReader.openIfChange方法操作 if (reader ==

win2003从组策略关闭端口(445/135/137/138/139/3389等)教程

一些恶劣的病毒会从某些端口入侵计算机,因此关闭某些用不到的而又具有高风险的端口就显得很有必要,是服务器管理员要做的基本的安全防范.本文将介绍win2003系统在组策略关闭某一个端口的教程,文章以关闭445端口为例. 首先要说明的是,此方法不仅仅适用于win2003,也适用于win7,且操作方法完全相同,所以win7用户也可以按照本文教程操作. 1.打开组策略编辑器 按组合键WIN+R打开运行窗口,然后输入gpedit.msc,按回车键,即可进入组策略编辑器. 2.创建 IP 安全策略 展开选项"

C# 远程服务器 安装、卸载 Windows 服务,读取远程注册表,关闭杀掉远程进程

这里安装windows服务我们用sc命令,这里需要远程服务器IP,服务名称.显示名称.描述以及执行文件,安装后需要验证服务是否安装成功,验证方法可以直接调用ServiceController来查询服务,也可以通过远程注册表来查找服务的执行文件:那么卸载文件我们也就用SC命令了,卸载后需要检测是否卸载成功,修改显示名称和描述也用sc命令.至于停止和启动Windows服务我们可以用sc命令也可以用ServiceController的API,当停止失败的时候我们会强制杀掉远程进程,在卸载windows

MySQL 启动与关闭

MySQL 启动原理:http://www.cnblogs.com/andy6/p/6602943.html 启动:/etc/init.d/mysqld start 关闭:/etc/init.d/mysqld stop

centos 6.X 关闭selinux

SELinux(Security-Enhanced Linux) 是美国国家安全局(NSA)对于强制访问控制的实现,是 Linux历史上最杰出的新安全子系统.在这种访问控制体系的限制下,进程只能访问那些在他的任务中所需要文件.SELinux 默认安装在 Fedora 和 Red Hat Enterprise Linux 上. 虽然SELinux很好用,但是在多数情况我们还是将其关闭,因为在不了解其机制的情况下使用SELinux会导致软件安装或者应用部署失败 以下就是关闭SELinux的方法 系统

CentOS 7.X 关闭SELinux

1.查看 [root@dev-server ~]# getenforce Disabled [root@dev-server ~]# /usr/sbin/sestatus -v SELinux status: disabled 2.临时关闭 ##设置SELinux 成为permissive模式 ##setenforce 1 设置SELinux 成为enforcing模式 setenforce 0 3.永久关闭 vi /etc/selinux/config 将SELINUX=enforcing改为