2011-03-31 62 views
0


如果在lucene索引上只發生插入操作(不刪除/更新),docID是不是正在改變?它也是可靠的
如果它是真的,我想用它作爲加載FieldCache增量降低加載所有文件的開銷,什麼是最好的解決方案?Lucene docID可靠性

回答

2

我不太清楚你打算同場緩存做什麼,但我的文檔ID的理解是,他們可以在插入過程中發生變化,這取決於掛起的刪除,合併政策等

即文檔ID不應過去犯下的邊界被用在重新開放的指數讀者

希望這有助於

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];