lucene4.5 deleteDocument和updateDocument不起作用


Directory indexDir = new SimpleFSDirectory(new File("D:" + File.separator + "testindex"));
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_45);
IndexWriterConfig writerConfig = new IndexWriterConfig(Version.LUCENE_45, analyzer);
writerConfig.setOpenMode(OpenMode.CREATE_OR_APPEND);
IndexWriter indexWriter = new IndexWriter(indexDir, writerConfig);
Document document = new Document();
Field stringField = new TextField("int1", "hello lucky boy", Store.YES);

document.add(stringField);
indexWriter.addDocument(document);
indexWriter.close();
Term term = new Term("int1", "hello lucky boy");
IndexWriterConfig writerConfig2 = new IndexWriterConfig(Version.LUCENE_45, analyzer);
IndexWriter indexWriter2 = new IndexWriter(indexDir, writerConfig2);
indexWriter2.updateDocument(term, document);
indexWriter2.deleteDocuments(term);
indexWriter2.close();
System.out.println("......" + document);
System.out.println("...跟新索引文件结束...");

updateDocument或deleteDocuments不工作。

文档还是一样的。我的lucene是4.5。
有什么问题吗?

我已经搜索了许多方法。看起来没变,有人能帮帮我吗?

1 - This:

Term term = new Term("int1", "hello lucky boy");

将不被分析。由于您正在使用StandardAnalyzer对文档进行索引,因此您希望在索引中找到术语:'hello'、'lucky'和'boy'。您的查询是针对单个术语"hello lucky boy",因此您将找不到匹配项。在更新或删除文档时,使用Term来标识它们,假设您可以使用单个术语唯一地标识文档。如果你不能这样做,传递一个查询代替,然后你可以依靠QueryParser为你应用分析。

一个很好的例子:用TermQuery

搜索你的术语
TopDocs docs = indexSearcher.search(new TermQuery(new Term("int1", "hello lucky boy")), 10);

如果你没有得到任何结果,那么lucene在试图查找要删除的文档时也不会。

2 - This:

indexWriter2.updateDocument(term, document);
indexWriter2.deleteDocuments(term);

没有必要在你刚刚更新完文件后再删除它们。旧的文件已经被updateDocuments调用删除了。如果您更改了内容,使term不再与更新后的文档匹配,那么它什么也不做。如果term仍然匹配,它将删除新版本的文档。

3 -你不显示你是如何查看索引的,但确保你在更新索引后重新打开阅读器。如果你不这样做,你将不会看到文档的变化,直到你这样做。

最新更新