FieldCache использует слабые ссылки на считыватели индекса в качестве ключей для своего кэша.(При вызове IndexReader.GetCacheKey
, который не устарел.) Стандартный вызов IndexReader.Open
с FSDirectory
будет использовать пул считывателей, по одному на каждый сегмент.
Вы должны всегда передавать самые внутренниечитатель к FieldCache.Проверьте ReaderUtil
на некоторые вспомогательные материалы для извлечения отдельного читателя, в котором содержится документ.Идентификаторы документа не будут меняться в пределах сегмента, что они имеют в виду, когда описывают его как непредсказуемый / изменчивый, что он будет меняться между двумя фиксациями индекса.Удаленные документы могли быть распознаны, сегменты были объединены, и такие действия.
При фиксации необходимо удалить сегмент с диска (объединено / оптимизировано), что означает, что у новых читателей не будет считывателя из объединенных сегментови сборщик мусора удалит его, как только все старые читатели закроются.
Никогда, никогда не звоните FieldCache.PurgeAllCaches()
.Он предназначен для тестирования, а не для производственного использования.
Добавлено 2011-04-03;пример кода с использованием подчитывающих.
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];