【问题标题】:How do i delete/update a doc with lucene?如何使用 lucene 删除/更新文档?
【发布时间】:2010-04-14 04:25:04
【问题描述】:

我正在创建一个tagging system for my site

我了解了将文档添加到 lucene 的基础知识,但我似乎知道如何在用户更改某些内容的标签时删除文档或更新文档。我发现页面说使用文档索引并且我需要在效果之前进行优化但是我如何获得文档索引?我还看到另一个说要使用 IndexWriter 删除但我也不知道该怎么做。

我正在使用 C# asp.net,但我没有在该机器上安装 java

【问题讨论】:

    标签: lucene lucene.net


    【解决方案1】:

    您使用的是哪个版本的 Lucene? IndexWriter 类有一个更新方法,可让您进行更新(顺便说一句,更新实际上是先删除后添加)。您将需要一些标识符(例如文档 ID)来更新。当您索引文档时,添加一个唯一的文档标识符,例如 URL、计数器等。然后“术语”将是您希望更新的文档的 ID。例如使用 URL,您可以这样更新:

    IndexWriter writer = ...
    writer.update(new Term("id","http://somedomain.org/somedoc.htm"), doc); 
    

    【讨论】:

    • 孵化-Apache-Lucene.Net-2.0-004-11Mar07.bin.zip。所以也许是 lucene 2.0。
    • 哎呀,我才意识到日期。我使用 Lucene.Net_2_9_1 找到了一个 svn 标签
    • 我很清楚。 Doc 是填充了我想要的数据的新文档。该术语是我要更新/替换的旧文档的 ID? -edit- update 看起来像一个 DeleteAdd。 doc 不需要与旧的保持相同的 id 或 term。
    • 是的,你的第一点。不确定第二个是什么意思,建议为您的文档设置一个 id 术语(就像为 db 表设置一个主键一样)。
    • 完美,我刚刚测试过。即使该术语不存在,它也会创建一个文档。我的 ID 将与媒体或文档 ID 相同(这是我的数据库中的 PK)
    【解决方案2】:

    您需要一个IndexReader 来删除一个文档,我不确定.net 版本,但是Lucene API 的Java 和C++ 版本有一个IndexModifier 类,它隐藏了IndexReader 和@ 之间的差异987654324@ 类,只需使用适当的类,就像您调用 addDocument()removeDocument() 一样。

    此外,在 Lucene 中没有更新文档的概念,您必须将其删除,然后再重新添加。为此,您需要确保每个文档在索引中都有一个唯一的存储 ID。

    【讨论】:

    • 很高兴了解更新。我没有看到 removeDocument 也没有 IndexModifier(可能 .net 使用的是旧版本的 lucene)。我在 IndexReader 中看到了一个 DeleteDocument。它接受'int docNum'。我不知道该怎么办。文档中没有 docNum 或 docId
    • docnum是枚举键,例如IndexReader rdr = IndexReader.Open(@"Myindex"); int N = rdr.MaxDoc(); for(int n = 0; n
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-07
    • 1970-01-01
    相关资源
    最近更新 更多