FieldCache使用弱引用来索引阅读器,作为其缓存的键。(通过调用
IndexReader.GetCacheKey已未过时。)的标准调用
IndexReader.Open一个
FSDirectory会用读者的一个游泳池,一个为每个段。
您应该始终将最里面的读取器传递给FieldCache。签出
ReaderUtil一些帮助者的资料,以检索其中包含文档的个人阅读器。文档ID不会在段中更改,将其描述为不可预测/易变的含义是在两次索引提交之间更改。可以对删除的文档进行验证,对段进行合并以及执行此类操作。
提交需要从磁盘中删除该段(合并/优化),这意味着新的读取器将没有池化段读取器,并且在关闭所有较旧的读取器后,垃圾回收会将其删除。
永远不要打电话
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];


