在有关 Lucene 的问题 (7) ,讨论了使用 Lucene 内存索引和硬盘索引构建实时索引的问题。
然而有的读者提到,如果涉及到文档的删除及更新,那么如何构建实时的索引呢?本节来讨论这个
问题。
1 、Lucene 删除文档的几种方式
IndexReader.deleteDocument(int docID) 是用
IndexReader 按文档号删除。
IndexReader.deleteDocuments(Term term) 是用
IndexReader 删除包含此词 (Term) 的文档。
IndexWriter.deleteDocuments(Term term) 是用
IndexWriter 删除包含此词 (Term) 的文档。
IndexWriter.deleteDocuments(Term[] terms) 是
用 IndexWriter 删除包含这些词 (Term) 的文档。
IndexWriter.deleteDocuments(Query query) 是
用 IndexWriter 删除能满足此查询 (Query) 的文
档。
IndexWriter.deleteDocuments(Query[] queries)
是用 IndexWriter 删除能满足这些查询 (Query) 的文
档。
删除文档既可以用 reader 进行删除,也可以用 writer 进行删除,不同的是, reader 进行删除后,
此 reader 马上能够生效,而用 writer 删除后,会被缓存,只有写入到索引文件中,当 reader 再
次打开的时候,才能够看到。
2 、Lucene 文档更新的几个问题
2.1 、使用 IndexReader 还是 IndexWriter 进行删除
既然 IndexReader 和 IndexWriter 都能够进行文档删除,那么到底是应该用哪个来进行删除呢?
本文的建议是,用 IndexWriter 来进行删除。
因为用 IndexReader 可能存在以下的问题:
(1) 当有一个 IndexWriter 打开的时候, IndexReader 的删除操作是不能够进行的,否则会报
LockObtainFailedException
(2) 当 IndexReader 被多个线程使用的时候,一个线程用其进行删除,会使得另一个线程看到的
索引有所改变,使得另一个线程的结果带有不确定性。
(3) 对于更新操作,在 Lucene 中是先删除,再添加的,然而删除的被立刻看到的,而添加却不能
够立刻看到,造成了数据的不一致性。
(4) 即便以上问题可以通过锁来解决,然而背后的操作影响到了搜索的速度,是我们不想看到的。
2.2 、如何在内存中缓存文档的删除
评论0
最新资源