[英]Lucene can't find documents after update
似乎每当我更新索引中的现有文档(删除/添加的相同行为)时,都无法使用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);
}
这会产生以下控制台输出:
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:/)时,这只会发生(第二次搜索不起作用)。
您在pastebin中引用的代码找不到任何内容,因为您的StringField
只是一个停用词( a
)。 更换a
有一些东西,是不是停用词(如ax
),使两者的搜索返回单个文档。
如果要构造具有空停用词集( CharArraySet.EMPTY_SET
)但仍使用for StringField
StandardAnalyzer
,也a
正确的结果。 这不适用于file:/F:/
虽然。
但是,最好的解决方案是使用KeywordAnalyzer
替换StandardAnalyzer
。
我可以通过在所有索引操作之后重新创建我的工作目录来摆脱这种情况:例如,为这个名为“path_dir”的索引操作创建一个新目录。 如果您已更新,请调用以下操作并再次执行所有以前的工作。
StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_46);
FSDirectory dir;
try {
// delete indexing files :
dir = FSDirectory.open(new File(path_dir));
IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_46, analyzer);
IndexWriter writer = new IndexWriter(dir, config);
writer.deleteAll();
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
但请注意,如果您处理大数据,这种方式会非常慢。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.