• 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()时得以纠正。

  • 相关阅读:
    用Java求两个字符串所有的公共子序列
    Windows系统上安装logstash和logstash-input-jdbc
    Linux下zip文件的压缩和解压命令
    Linux-root用户下新建用户及为新用户配置密码
    Linux下查看是否安装jdk的命令
    使用git clone命令报错:error: RPC failed; curl 18 transfer closed with outstanding read data remaining
    SCP not a regular file
    常用正则表达式
    Android Wear 兼容
    git diff 配置 meld diff
  • 原文地址:https://www.cnblogs.com/zengen/p/2019669.html
Copyright © 2020-2023  润新知