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是不匹配的?
答案 0 :(得分:0)
添加文档后你是否(重新)打开了索引? Lucene搜索仅返回索引打开搜索时存在的文档。
[编辑...]
使用 IndexReader.Open()或 IndexReader.doOpenIfChanged()再次打开索引。 doOpenIfChanged()的优点是,如果您仍然可以使用旧的IndexReader实例(因为索引未更改),则返回null。
(如果我没记错的话, DirectoryReader.Open()只打开索引目录,因此如果你只是调用<,则更高级别的Lucene代码没有意识到索引已经改变了强> DirectoryReader.Open 即可。)