gpt4 book ai didi

java - Lucene 更新后找不到文档

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:27:36 24 4
gpt4 key购买 nike

似乎每当我更新索引中的现有文档时(删除/添加的行为相同),都无法使用 TermQuery 找到它。这是一个简短的片段:

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:/)时,才会发生这种情况(第二次搜索不起作用)。

最佳答案

您在 pastebin 中引用的代码没有找到任何内容,因为您的 StringField 只是一个停用词 (a)。将 a 替换为非停用词(例如 ax)会使两次搜索都返回 1 个文档。

如果您使用空停用词集 (CharArraySet.EMPTY_SET) 构建 StandardAnalyzer,但仍使用 a,您也会获得正确的结果对于 StringField。不过,这不适用于 file:/F:/

但是,在这种情况下,最好的解决方案是将 StandardAnalyzer 替换为 KeywordAnalyzer

关于java - Lucene 更新后找不到文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25892700/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com