似乎每当我更新索引中的现有文档(删除/添加的相同行为)时,都无法使用TermQuery找到它.这是一个简短的片段:
iw = new IndexWriter(directory,config);
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);
}
Run Code Online (Sandbox Code Playgroud)
这会产生以下控制台输出:
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>
________________
Run Code Online (Sandbox Code Playgroud)
似乎在更新之后,索引中的文档(而不是新文档)被MatchAllDocsQuery返回,但是由TermQuery找不到.
有关完整的示例代码,请访问http://pastebin.com/sP2Vav9v
此外,当StringField值包含特殊字符(例如file:/ F:/)时,这只会发生(第二次搜索不起作用).
您在pastebin 中引用的代码没有找到任何内容,因为您的StringField只是一个停用词( a)。替换a为非停用词的内容(例如ax)会使两个搜索都返回 1 个文档。
StandardAnalyzer如果您使用空停用词集 ( CharArraySet.EMPTY_SET) 进行构造,但仍使用afor ,您也将获得正确的结果StringField。但这是行不通的file:/F:/。
但是,最好的解决方案是在这种情况下替换StandardAnalyzer为KeywordAnalyzer.