Lucene docID可靠性

时间:2011-03-31 07:56:53

标签: c# java .net lucene lucene.net

您好
如果只对lucene索引进行插入操作(没有删除/更新),那么docID是否正在改变?而且它也很可靠 如果是真的,我想用它来逐步加载FieldCache来降低加载所有文件的开销,那是什么最好的解决方案?

2 个答案:

答案 0 :(得分:2)

我不太确定您计划使用字段缓存做什么,但我对文档ID的理解是它们可以在插入期间更改,具体取决于待处理的删除,合并策略等。

即。不应在重新打开的索引阅读器上使用文档ID超过提交边界

希望这有帮助,

答案 1 :(得分:0)

文档ID在段内是静态的。 IndexReader.Open(通常)会打开DirectoryReader,其中包含多个SegmentReader。您需要将“底部”阅读器传递给FieldCache才能使群体正常工作。

以下是来自FieldCache with frequently updating index的示例,它确保FieldCache只读取新读取的段,而不是最顶层的读取器(在每次提交时都会更改)。

var directory = FSDirectory.Open(new DirectoryInfo("index"));
var reader = IndexReader.Open(directory, readOnly: true);
var documentId = 1337;

// Grab all subreaders.
var subReaders = new List<IndexReader>();
ReaderUtil.GatherSubReaders(subReaders, reader);

// Loop through all subreaders. While subReaderId is higher than the
// maximum document id in the subreader, go to next.
var subReaderId = documentId;
var subReader = subReaders.First(sub => {
    if (sub.MaxDoc() < subReaderId) {
        subReaderId -= sub.MaxDoc();
        return false;
    }

    return true;
});

var values = FieldCache_Fields.DEFAULT.GetInts(subReader, "newsdate");
var value = values[subReaderId];