lucene4.5 deleteDocument和updateDocument不起作用

时间:2014-05-22 15:23:37

标签: java lucene

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 个答案:

答案 0 :(得分:0)

1 - 这:

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 - 这:

indexWriter2.updateDocument(term, document);

indexWriter2.deleteDocuments(term);

完成更新后,无需删除文档。 updateDocuments电话已删除旧文件。如果您更改了内容,term将不再与更新的文档匹配,则不会执行任何操作。如果term仍匹配,则会删除新版本的文档。

3 - 您没有显示您如何查看索引,但请确保在更新索引后重新打开阅读器。如果你不这样做,你就不会看到对文档的更改。