Идентификатор документа является статическим в пределах сегмента. IndexReader.Open
(обычно) открывает DirectoryReader
, который объединяет несколько SegmentReader
. Вам нужно будет передать «нижний» считыватель в FieldCache, чтобы население работало правильно.
Вот пример из FieldCache с часто обновляемым индексом , который гарантирует, что 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];