C# Lucene docID可靠性

C# Lucene docID可靠性,c#,java,.net,lucene,lucene.net,C#,Java,.net,Lucene,Lucene.net,嗨 若在lucene索引上只发生了插入操作(并没有删除/更新),docID是否不变?而且它也是可靠的 如果这是真的,我想使用它作为增量加载FieldCache以降低加载所有文档的开销,那么最好的解决方案是什么???我不太确定您打算如何处理FieldCache,但我对文档ID的理解是,它们可以在插入过程中更改,具体取决于挂起的删除,合并策略等 i、 e.在重新打开的索引读取器上,文档ID不应超过提交边界 希望这有所帮助,文档id在一个段中是静态的IndexReader.Open(通常)打开一个Di


若在lucene索引上只发生了插入操作(并没有删除/更新),docID是否不变?而且它也是可靠的

如果这是真的,我想使用它作为增量加载FieldCache以降低加载所有文档的开销,那么最好的解决方案是什么???

我不太确定您打算如何处理FieldCache,但我对文档ID的理解是,它们可以在插入过程中更改,具体取决于挂起的删除,合并策略等

i、 e.在重新打开的索引读取器上,文档ID不应超过提交边界


希望这有所帮助,

文档id在一个段中是静态的
IndexReader.Open
(通常)打开一个
DirectoryReader
,它组合了多个
段读取器
。您需要将“底部”读取器传递到FieldCache,以使总体正常工作

下面是一个示例,其中确保FieldCache只读取新读取的段,而不是最顶层的读取器(每次提交时都会被视为已更改)

var directory=FSDirectory.Open(新目录信息(“索引”);
var reader=IndexReader.Open(目录,只读:true);
var documentId=1337;
//抓取所有子阅读器。
var subReaders=新列表();
ReaderUtil.GatherSubReaders(子读取器,读取器);
//循环遍历所有子读取器。而子读取器ID高于
//子读取器中的最大文档id,转到下一步。
var subReaderId=documentId;
var subReader=subReaders.First(sub=>{
if(sub.MaxDoc()
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];