为什么我能';在Lucene 4.0的搜索结果中找不到IndexWriter最近添加的文档?

为什么我能';在Lucene 4.0的搜索结果中找不到IndexWriter最近添加的文档?,lucene,Lucene,如标题所说,我遇到了一个困惑的问题。 我已经为我的测试程序建立了一个索引,然后我使用IndexWriter将一个文档添加到索引中。代码是: IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_CURRENT, analyzer); IndexWriter iwriter = new IndexWriter(directory, config); Document doc1 = new Document(); doc1.a

如标题所说,我遇到了一个困惑的问题。 我已经为我的测试程序建立了一个索引,然后我使用IndexWriter将一个文档添加到索引中。代码是:

IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_CURRENT, analyzer);
IndexWriter iwriter = new IndexWriter(directory, config);
Document doc1 = new Document();
doc1.add(new Field("name", "张三", Field.Store.YES, Field.Index.ANALYZED));
doc1.add(new IntField("year", 2013, Field.Store.YES));
doc1.add(new TextField("content", "123456789", Field.Store.YES));
iwriter.addDocument(doc1);
iwriter.commit();
iwriter.close();
当我尝试在此索引中搜索时,无法获取此文档。我真的得到了一个正确的结果计数,比以前多了一个。但是当我试图打印doc.get('name')时,输出是错误的

搜索部分的代码为:

DirectoryReader ireader = DirectoryReader.open(directory);
System.out.println(ireader.numDeletedDocs());
IndexSearcher isearcher = new IndexSearcher(ireader);
// Parse a simple query that searches for "text":
QueryParser parser = new QueryParser(Version.LUCENE_CURRENT, "name", analyzer);
Query query = parser.parse("张");

ScoreDoc[] hits = isearcher.search(query, null, 1000).scoreDocs;
System.out.println(hits.length);
在结果中,有一个“名称:李四". 我确信我在索引和搜索时使用了StandardAnalyzer。StandardAnalyzer会将一个汉字作为单个标记。为什么我在搜索时使用?”张“,我会得到”李四“?添加文档时是否有任何错误?或者文档ID不匹配?

添加文档后是否(重新)打开索引?Lucene Searchs仅返回在打开索引进行搜索时存在的文档

[编辑…]

使用IndexReader.Open()IndexReader.doOpenIfChanged()再次打开索引。doOpenIfChanged()的优点是,如果仍然可以使用旧的IndexReader实例(因为索引没有更改),它将返回null


(如果我没记错的话,DirectoryReader.Open()只是打开索引目录,因此如果您只调用DirectoryReader.Open,更高级别的Lucene代码没有意识到索引已经更改)

请尝试打印查询,并注意是否符合预期。您能否提供用于检索文档的代码?重新打开索引是否与
DirectoryReader.open(directory);
??仅执行单个
目录。close()
结尾。在添加文档和搜索文档之间是否需要另一个关闭/打开?