1

如题所说,我遇到了一个不解的问题。我已经为我的测试程序建立了一个索引,然后我使用 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 会将一个汉字作为一个单一的记号。为什么我搜索“张”会得到“李四”?添加文档时有什么问题吗?还是docid不匹配?

4

1 回答 1

0

添加文档后,您是否(重新)打开了索引?Lucene 搜索只返回在打开索引进行搜索时存在的文档。

[编辑...]

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

(如果我没记错的话,DirectoryReader.Open()只是打开了索引目录,所以如果你只是调用DirectoryReader.Open,更高级别的 Lucene 代码不会意识到索引已经改变。)

于 2013-03-05T22:29:14.070 回答