关于lucene断点续索引和增量索引的问题

关于lucene断点续索引和增量索引的问题
1、 像百度、google等桌面搜索建立索引的时候可以停止后重新索引,他能保证以前索引过的文件重新索引的时候不用再索引吗?如果停止后要索引的文件进行了 删除和添加等操作,那么他是怎么处理的以保证索引文件的覆盖率。用lucene索引文件的时候如何实现这种功能,给个思路。

2、如何在我 给一个目录里添加一个文件的时候自动把这个文件用lucene索引起来,就是所谓的增量索引,难道用个timer扫描目录变化或者用filewatch来 监视这个目录,然后对其索引吗?可是这样的话必须做个windows服务了,要不这个软件关闭的话就不能相应目录里文件的变化了。

3、如果一个文件修改或者删除了,如何同步到索引里,用IndexReader找这个Document的时候考什么去找,必须要在Document里放一个类似于主键的域来找到它,并删除或者重新建立索引吗?

就这3问题,大家给说说思路,谢谢。
回复人:onlytiancai(谁染枫林醉) ( ) 信誉:80 2007-3-27 13:37:44 得分:0
 
 
?

关于lucene断点续索引和增量索引的问题
1、 像百度、google等桌面搜索建立索引的时候可以停止后重新索引,他能保证以前索引过的文件重新索引的时候不用再索引吗?如果停止后要索引的文件进行了 删除和添加等操作,那么他是怎么处理的以保证索引文件的覆盖率。用lucene索引文件的时候如何实现这种功能,给个思路。

2、如何在我 给一个目录里添加一个文件的时候自动把这个文件用lucene索引起来,就是所谓的增量索引,难道用个timer扫描目录变化或者用filewatch来 监视这个目录,然后对其索引吗?可是这样的话必须做个windows服务了,要不这个软件关闭的话就不能相应目录里文件的变化了。

3、如果一个文件修改或者删除了,如何同步到索引里,用IndexReader找这个Document的时候考什么去找,必须要在Document里放一个类似于主键的域来找到它,并删除或者重新建立索引吗?

就这3问题,大家给说说思路,谢谢。
-----------------
判断索引目录的segments文件是否存在,
如果存在,用增量索引
否则, 重新创建索引


如果是重新创建索引
只需要遍历需要索引的内容,然后新增文档

如果是增量索引
判断主Key[文件名(包含全路径)]在索引中是否存在
如果存在
判断[文件的修改时间],是否和索引中保存的[修改时间]一致
如果不一致
删除旧的索引中的该索引项目
新增对该文档的索引
否则
新增该文档的索引

缺点,不能发现已经删除的文件,当然是认为的去某个目录删除该文件。
如果是程序的话当然是可以的,只需要把索引中的项目删除。


CodeProject上面的http://www.codeproject.com/csharp/DesktopSearch1.asp

使用微软的IndexService,需要win2000或者win2000以上的版本。

缺点,好像这些函数在处理 修改word一点点内容之后,算法会有一些问题,如果重新编制索引,又不会出现:( 不知道是不是我做错了。
-------------------
用lucene为数据库搜索建立增量索引
http://www.cnblogs.com/maxwolf/archive/2005/10/25/262034.html
------------------
lucene中增量索引的方法!
http://javaeyes.javaeye.com/blog/30959
-------------------
海量数据的管理及增量索引(全文检索系统)
对 于分布式的全文检索系统,海量数据的管理与增量索引策略显得尤为重要,因为很多用户时时地对数据进行检索,而后台又有多个子系统在时时地往总库写数据,而 各客户端需要对添加到库里的数据实时地查询到。而对于全文检索系统用户查询到的提前必须对入到库里的数据进行索引,这样用户才能看到数据。而且每天的数据 量多的时候可能有好几十万条,每一条数据基本上都是在70K以上,因为好几个字段都是全文字段。这让我在设计方案时颇费心计呀。最终我的方案出来了,程序 也基本上写好了,不过效率如何还得测试测试。我的方案大致如下:(用的是CNKI的全文检索数据库系统KBase)
1、使用联合表的思想将多个物理上独立的表在逻辑上统一起来
2、联合表由年表、月表、日表组成。
3、每日晚上12点将上一天的日表合并到月表中去,并做索引
4、每月月初将上一月的月数据合并到当年年表中去,并索引
5、第3 步是一个可选项,也可以是在月未对所有当月的月数据进行合并,并做一次索引
6、第4步也可以是到年底对一年的月数据进行一次合并,并做一次索引
对 于KBase系统来说这是一个比较好的方案,但若KBase能支持嵌套的联合表和可更新的视图就好了,这样对于月表不需要合并,只需要再建一个联合表或者 视图即可,目前的视图由于只能查询,而不能将修改更新回去。而且对于这种系统月表的数据粒度也是比较适中的一个数据级。这样可提高系统的效率,另外加上并 行表的支持,这样可以将数据分散到不同的机器上,而由一个视图或者联合表统一管理。这是一种最优的方法,但需要KBase进行一定的改进。
--------------------
主题: 关于lucene文件锁和增量索引BUG的讨论。
http://www.javaeye.com/post/225074
-------------------
通过dotLucene实现增量索引.
http://xiaohui.cnblogs.com/archive/2004/10/23/55715.aspx
---------------------
全文检索系统中海量数据的增量索引
全 文检索系统中如果每天处理至少10多万条的文本数据,那么如何对这些新增加的数据进行增量索引并进行有效地管理是整个系统的关键。通过采用联合表或者并行 表的方式来管理这些数据,但是每一个并行表的粒度应该设多大,设多少个子表或者并并行表都需要系统的应用规模来定。如果并行表的粒度过大,即使是在索引过 程中采用的是拉链索引的方式来组织索引数据,也是需要大量的索引数据的遍历,若不是拉链更需要索引数据的大量移动来进行索引合并,进而严重影响系统性能。 但是如果数据粒度过小,这样子表会很多,这样在检索时会影响到检索的性能,因为需要查询很多个子表才能返回结果。而如果对子表定期地合并,这样在合并的次 数也会大大增加,合并完后还需要作一次整体索引。所以设计子表粒度和子表的个数时需要慎重考虑,根据自己系统的实际情况而定。
--------------------
关于lucene中增量索引的问题
Draem 2006-09-05 23:16
为 什么我将IndexWriter的第三个参数改为false后,还是会重新索引而不是做增量索引呢?IndexWriter writer = new IndexWriter(indexDir, new StandardAnalyzer(), false);也许已经是做的增量索引,但我好象没发觉有什么差别,比如说速度变快。增量索引是不是指之前已经建立了索引的文件就不再建立索引呢?


旋风小子 1970-01-01 08:00
对于增量索引,Nutch从架构设计得以解决的比如:利用目录的不同,保存不同的数据segments/20****目录这样在检索时就可以持续增量.
--------------------
lucene是支持增量索引的,但是我在index上用indexWriter的addDocument(Document)之后,用IndexReader,不能搜索到新增的Document的内容的?
先关闭indexwrite,关闭之后才能讲Document写入到索引文件中
----------------------

先用我现在的真实项目作为环境给大家介绍一下:30万左右的纪录数,几十人不停的在维护这些纪录,索引的建立方式我采用了8个小时一次全量索引、20分钟 一次增量索引,之所以跑的这么频繁,是希望能保持一定的实时性(增量)和准确性(全量),索引存放的目录加一个整型的数字作为文件夹名称,每一次新的全量 索引的建立都用一个大一位的整数存放,等索引建完后自动切换到新的索引文件进行检索。以上这些就是大致的情况,下面分别讨论标题提到的两个问题:
1、文件锁。
每次全量索引的文件大小大概为130M,每次增量索引大概增加一倍,一段时间后索引文件的大小非常可观,由于每次新的全量索引会重新建立一个目录,故采用 自动删除旧的目录方式,但是被使用过的旧的索引文件却无法删除,即使使用了IndexReader的unclock方法也不行,不知道大家有没有遇到过这 种情况。
2、增量索引的BUG。
lucene利用IndexWriter(dir, analysis, false)中的最后一个参数设置不清空目录来创建增量索引,在修改的时候其实原理类似于我上面创建新的全量索引的方式,但是切换的时间不一样,我是在新 的索引完成后切换,但是lucene是在一开始就切换,这样就会造成修改的数据量如果很大,在修改的期间检索出来的结果非常不稳定,我觉得这应该是一个逻 辑上的BUG,不知大家认为如何。

他应当是有做optimize的,只是因为他说

“被使用过的旧的索引文件却无法删除”

应该是还有程序在使用里面的索引文件,在切换点上没有进行完全的close或者close没有真正完成,是否考虑延时close与删除,然后先删除目录里的文件,再去试着删除目录。

另外,我想知道你动态切换的时间点是什么,具体说说,如何应对并发呢?


 

你好,我也是做lucene搜索的,目前项目遇到的情况跟你的那种状况很类似,我们目前的索引数量有50万,每10分钟更新一次,每次都会有新增2000 条,整个索引文件有几百M了,全量更新一次要花1个小时,预见未来的数据规模会达到百万级别。你的帖子有个回复提到Compass,我查了一下,感觉听适 合我们的需求的,主要是对象索引映射实现的实时更新很诱人:),不知道你那边情况怎么样,用Compass好使否?索引性能怎么样?
我的msn:[email protected] 非常有兴趣和你聊聊 ,谢了。


 


 

我最近也在做lucene,关于增量索引是挺让人头疼,我觉得lucene这个增量索引做的不尽人意,每一次增量它本身不会判断重复的索引,相当于在原来 的基础上又做了一次全量索引,当然少了一步清空目录的操作,关于增量索引,自己还要做判断,每一次的循环addDocument()要判断原索引中是否存 在重复的索引,如果是还要判断文件最后的修改时间是否跟索引的最后修改时间相匹配!不匹配删除掉,把新的添加到索引中.关键问题是如何判断文件的主KEY (文件名和路径)索引中是否存在!!这个也是我一直没有解决掉的,看了一下LUCENE的底层代码并没有提供这样的接口供调用!迷惑,如果哪位仁兄有好的 方法希望一起探讨,赐教!

 

你可能感兴趣的:(关于lucene断点续索引和增量索引的问题)