【发布时间】:2011-03-31 07:56:52
【问题描述】:
嗨
如果 lucene 索引上只发生插入操作(没有删除/更新),那么 docID 是否没有改变?而且它也很可靠
如果是真的,我想用它来增量加载 FieldCache 以降低加载所有文档的开销,最好的解决方案是什么??
【问题讨论】:
标签: c# java .net lucene lucene.net
嗨
如果 lucene 索引上只发生插入操作(没有删除/更新),那么 docID 是否没有改变?而且它也很可靠
如果是真的,我想用它来增量加载 FieldCache 以降低加载所有文档的开销,最好的解决方案是什么??
【问题讨论】:
标签: c# java .net lucene lucene.net
我不太确定您打算如何处理字段缓存,但我对文档 ID 的理解是,它们可以在插入期间更改,具体取决于挂起的删除、合并策略等。
即文档 ID 不应在重新打开的索引阅读器上超过提交边界使用
希望这会有所帮助,
【讨论】:
文档 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];
【讨论】: