首页 > java > lucene删除索引中的数据

lucene删除索引中的数据

2009年12月18日 发表评论 阅读评论
Lucene本身并不支持更新, 所以只能选择先删除再新增记录。
lucene本身支持两种删除模式
1,DeleteDocument(int docNum) //指定文档标号自动删除
2,DeleteDocuments(Term term) //删除所有出现该term的文档
前者是根据文档的编号来删除该文档,docNum是该文档进入索引时Lucene的编号,是按照顺序编的;后者是删除满足某一个条件的多个文档。
docNum太难获取,一般使用的是第二种,因此增加时需要有唯一值
 IndexReader reader = IndexReader.Open(path));

 int count=reader.DeleteDocuments(new Term("key","value"));

 
Lucene的删除也就是一次搜索的过程.
备注:需要匹配删除的字段存储时不要进切词.

在执行了DeleteDocument或者DeleteDocuments方法后,系统会生成一个*.del的文件,该文件中记录了删除的文档,但并未从物理上删除这些文档。此时,这些文档是受保护的,当使用Document doc = reader.Document(i)来访问这些受保护的文档时,Lucene会报“Attempt to access a deleted document”异常。如果一次需要删除多个文档时,可以用两种方法来解决:

1.         删除一个文档后,用IndexWriter的Optimize方法来优化索引,这样我们就可以继续删除另一个文档。

2.         2. 先扫描整个索引文件,记录下需要删除的文档在索引中的编号。然后,一次性调用DeleteDocument删除这些文档,再调用IndexWriter的Optimize方法来优化索引。

分类: java 标签: , 3,394 次阅读
原文链接:http://www.wenhq.com/article/view_412.html
欢迎转载,请注明出处:亲亲宝宝
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.