zoukankan      html  css  js  c++  java
  • Lucene.net中IndexWriter.DeleteDocument与IndexReader.DeleteDocument区别

    IndexReader删除

    IndexReader.DeleteDocument(int docNum)——根据Document的docId删除单个Document

    IndexReader.DeleteDocuments(Term term)——根据Term来删除单个或多个Document

    使用IndexReader进行Document删除操作时,文档并不会立即被删除,而是把这个删除动作缓存起来,直到调用IndexReader.Close()时,删除操作才会被真正执行。

    注:使用IndexReader进行删除时,必须关闭所有已经打开的IndexWriter;当使用当前的IndexReader进行搜索时,即使在不关闭IndexReader的情况下,被删除的Document也不会再出现在搜索结果中。

    IndexWriter删除

    IndexWriter.DeleteDocuments(Query query)——根据Query条件来删除单个或多个Document

    IndexWriter.DeleteDocuments(Query[] queries)——根据Query条件来删除单个或多个Document

    IndexWriter.DeleteDocuments(Term term)——根据Term来删除单个或多个Document

    IndexWriter.DeleteDocuments(Term[] terms)——根据Term来删除单个或多个Document

    IndexWriter.DeleteAll()——删除所有的Document

    使用IndexWriter进行Document删除操作时,文档并不会立即被删除,而是把这个删除动作缓存起来,当IndexWriter.Commit()或IndexWriter.Close()时,删除操作才会被真正执行。

    总结:

    建议使用IndexWriter来进行删除,除非

    1. 你必须按照DocId来删除;
    2. 删除后搜索要立即看到删除的效果,即删除的数据在搜索的结果中不再出现
    3. 你需要知道执行删除操作删除的Document的数量

    使用IndexReader进行删除时可能存在以下问题

    1. 当有一个IndexWriter打开的时候,IndexReader的删除操作是不能够进行的,否则会报LockObtainFailedException
    2. 当IndexReader被多个线程使用的时候,一个线程用其进行删除,会使得另一个线程看到的索引有所改变,使得另一个线程的结果带有不确定性。
    3. 对于更新操作,在Lucene中是先删除,再添加的,然而删除的被立刻看到的,而添加却不能够立刻看到,造成了数据的不一致性。
    4. 即便以上问题可以通过锁来解决,然而背后的操作影响到了搜索的速度,是我们不想看到的。

    使用IndexWriter与IndexReader进行Document删除时唯一的不同是:IndexReader.DeleteDocuments()可以返回被删除的文档数目。

    Document一旦被删除,就不会存在于termDocs和termPositions以及任何搜索结果中出现了,当强行载入此文档时会报异常,但是该文档依然会影响docFreq,从而影响搜索评分,这个问题会在包含被删除的Document所在的段(Segment)合并时得到纠正,即当调用IndexWriter.Optimize()时得以纠正。

  • 相关阅读:
    Haskell Interactive Development in Emacs
    Access Java API in Groovy Script
    手工设置Eclipse文本编辑器的配色
    Color Theme of Emacs
    Gnucash的投资记录
    Special Forms and Syntax Sugars in Clojure
    Use w3m as Web Browser
    SSE指令集加速之 I420转BGR24
    【图像处理】 增加程序速度的方法
    TBB 入门笔记
  • 原文地址:https://www.cnblogs.com/zengen/p/2019669.html
Copyright © 2011-2022 走看看