Как вы можете видеть в FieldCache.java
, есть несколько различных способов загрузки кеша поля (getBytes, getInts, getStringIndex, getStrings, ...).Вот почему FieldCacheImpl
поддерживает map (type -> cache)
.
Сегменты Lucene предназначены для однократной записи и только для чтения, поэтому вы хотите загрузить кэш полей только один раз, а затем всегда повторно использовать один и тот же экземпляр.,Cache - это вспомогательный класс, который помогает достичь этого: это обертка вокруг map (segment -> map (field -> fieldcache instance))
.(Под экземпляром fieldcache я имею в виду byte[]
для метода getBytes
, String[]
для метода getStrings
, ...)
Когда сегмент не являетсяиспользуется больше (если больше нет открытого читателя, использующего его), вы хотите, чтобы GC мог вернуть кэш поля, поэтому эта карта является WeakHashMap .
Существуют различные реализации Cache
, потому что логика не одинакова при загрузке (например) кэша String и кэша StringIndex (см. Cache#createValue(AtomicReader, Entry, boolean)
).