我想获取我刚刚添加到Lucene索引的文档的int docid,以便我可以将其粘贴到Filter中以更新常设查询。我的文档有一个唯一的外部id,所以我认为对唯一id进行TermDocs枚举会返回正确的文档,如下所示:
protected int getDocId(IndexReader reader, String idField, Document doc) throws IOException {
String id = doc.get(idField);
TermDocs termDocs = reader.termDocs(new Term(idField, id));
int docid = -1;
while (termDocs.next()) {
docid = termDocs.doc();
Document aDoc = reader.document(docid);
String docIdString = aDoc.get(idField);
System.out.println(docIdString + ": " + docid);
}
return docid;
}
不幸的是,这个循环和循环,返回相同的docIdString并增加docids。
为新添加的文档获取docids的建议方法是什么,以便我可以在提交文档后立即在过滤器中使用它们?
答案 0 :(得分:1)
文档的文档ID 不与您的id字段中的值相同。文档ID是内部Lucene标识符,您可能无法访问该标识符。你的领域只是一个领域 - 你可以称之为“ID”,但Lucene不会对它做任何特殊的事情。
您为什么要尝试手动更新过滤器?提交时,可能会发生合并等,因此之前的ID与之后的ID不同。 (这只是一个例子,你不应该依赖Lucene ID来做任何事情。)所以你不需要只将一个文档添加到过滤器中,你需要更新整个文件。
要更新缓存过滤器,只需运行“foo”查询,然后将过滤器与CachingWrapperFilter
一起使用。
编辑:因为您的ID字段只是一个字段,所以您可以像搜索其他内容一样搜索它:
TopDocs results = searcher.Search(new TermQuery(new Term("MyIDField", Id)), 1);
int internalId = results.scoreDocs[0].doc;
然而,就像我说的,我认为你想忽略内部ID。所以我会从查询中构建一个过滤器:
BooleanQuery filterQuery = new BooleanQuery(); // or get existing query from cache
filterQuery.Add(new TermQuery(new Term("MyIdField", Id)), BooleanClause.Occur.SHOULD);
// add more sub queries for each ID you want in the filter here
Filter myFilter = new CachingWrapperFilter(new QueryWrapperFilter(filterQuery));