使用索引中的lucene / delete term重新索引

时间:2011-06-01 15:17:59

标签: java indexing lucene stop-words

我希望你能帮助我,这是我的问题:

编辑:现在我重新想一想,如果有办法从索引中删除一个术语,那么它无论如何都会有用。有没有办法做到这一点?如果有的话,没有必要阅读其余的问题。谢谢!

这是我打算做的: 1 - 我必须在删除标准停用词时索引某些文件。 2 - 之后,我必须计算每个术语的文档频率,并删除那些df< 2

我是怎么做的:

1 - 我使用indexwriter索引文件,同时删除std停用词。 2 - 我计算每个术语的df,然后添加到停用词列表中。 3 - 然后,我使用indexwriter再次索引文本,但使用新的停用词列表

真正发生的事情:

我第一次将其编入索引按计划进行。问题是当我尝试第二次索引时。结果变得非常不可预测:

1)如果我运行程序一次,即使停用词有新单词,也只删除std停用词。

2)如果我第二次运行程序,则使用df< 2被删除。

我在索引中打印两次,第一次索引后打印一次,第二次索引后打印一次。

当我第二次跑步时,条款与df< 2在第一次打印中显示已删除(请注意我在第一次打印时添加了df< 2时的条件,它不应该在第一次打印中删除)。

也许我解释的方式有点令人困惑,我请你告诉我是否有些事情无法理解。

我希望你们能帮助我。 非常感谢你!

1 个答案:

答案 0 :(得分:1)

第二次索引文档时,请确保删除文档的第一个实例,否则您将为所有术语扩展dfs。您可以通过外部ID字段删除文档:使用field = idfield&创建Term。 value = externalId,然后使用IndexWriter的deleteDocument(Term)删除旧实例;然后添加新的。我认为没有办法明确删除条款;它们来自文件。

作为优化,您可以考虑以下事项: 1.索引所有文件 2.找到df = 1的所有项 3.删除每个术语的所有文档,跟踪其外部文档ID 4.将条款添加到停止列表中 5.仅重新索引先前删除的文档。

当然,首先您必须仔细考虑删除这些术语的用例。 1.如果它们出现在索引中,为什么重要? 2.如果稍后更新索引会发生什么,并添加一个新文档,该文档会导致之前df = 1的某个术语现在具有df = 2。您将无法对该术语编制索引,因为它已经在停止列表中。