【发布时间】:2014-09-17 14:00:36
【问题描述】:
似乎每当我更新索引中的现有文档(删除/添加的行为相同)时,都无法使用 TermQuery 找到它。这是一个简短的 sn-p:
iw = new IndexWriter(目录,配置);
Document doc = new Document();
doc.add(new StringField("string", "a", Store.YES));
doc.add(new IntField("int", 1, Store.YES));
iw.addDocument(doc);
Query query = new TermQuery(new Term("string","a"));
Document[] hits = search(query);
doc = hits[0];
print(doc);
doc.removeField("int");
doc.add(new IntField("int", 2, Store.YES));
iw.updateDocument(new Term("string","a"), doc);
hits = search(query);
System.out.println(hits.length);
System.out.println("_________________");
for(Document hit : search(new MatchAllDocsQuery())){
print(hit);
}
这会产生以下控制台输出:
stored,indexed,tokenized,omitNorms,indexOptions=DOCS_ONLY<string:a>
stored<int:1>
________________
0
_________________
stored,indexed,tokenized,omitNorms,indexOptions=DOCS_ONLY<string:a>
stored<int:2>
________________
似乎更新后,索引中的文档(而不是新文档)被 MatchAllDocsQuery 返回,但无法被 TermQuery 找到。
完整的示例代码可在http://pastebin.com/sP2Vav9v获得
此外,只有当 StringField 值包含特殊字符(例如 file:/F:/)时,才会发生这种情况(第二次搜索不起作用)。
【问题讨论】:
-
你不缺
iw.commit()吗? -
不会改变任何东西。已经试过了。此外,搜索每次都会从作者那里打开一个新的阅读器: DirectoryReader reader = DirectoryReader.open(iw, true);
-
我似乎遇到了类似的问题。这是哪个版本的 Lucene?
-
试用了 4_6 和 4_10 之间的多个版本。