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 有什么问题吗?
我搜索了很多方法。它看起来是一样的,所以任何人都可以帮助我吗?
答案 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 - 您没有显示您如何查看索引,但请确保在更新索引后重新打开阅读器。如果你不这样做,你就不会看到对文档的更改。