如何从Lucene 3.0.3获得可靠的docid?

时间:2011-03-13 17:08:54

标签: lucene

我想获取我刚刚添加到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的建议方法是什么,以便我可以在提交文档后立即在过滤器中使用它们?

1 个答案:

答案 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));