使用CachingWrapperFilter简单地缓存每个搜索是否可以?

时间:2013-02-06 16:50:39

标签: caching lucene lucene.net

使用Lucene.Net 3.0.3,可以很容易地简单地包装为响应用户在CachingWrapperFilter中搜索而创建的每个查询。这会是一个坏主意,因为Lucene会消耗越来越多的内存,还是Lucene会以智能的方式管理内存并释放缓存的项目?

我是否应该选择我在CachingWrapperFilter中包装的查询?

Query query = .... 
QueryWrapperFilter queryFilter = new QueryWrapperFilter(query);
CachingWrapperFilter cachingFilter = new CachingWrapperFilter(queryFilter);
searcher.search(query, cachingFilter, 1);

更新

CachingWrapperFilter的Lucene.Net实现也使用了与垃圾收集相关联的机制。它实现了一个WeakDictionary类,该类使用WeakReference类的实例进行键控。这是一个内置的.Net类,它包装任何对象,并提供一种方法来检查该对象是否已被垃圾回收。这告诉我,我的问题的答案是肯定的。 Lucene缓存的内存管理将受到控制,因为它基本上与运行时垃圾收集器绑定,并且只要它们仍然有效,就会维护缓存项。

更详细一点......

缓存的密钥由IndexReader提供,然后再包含在WeakReference中。 IndexReader管理它提供的对象作为缓存键。当它们不再有效时,它们会被丢弃并随后被垃圾收集。然后缓存可以通过WeakReference检测到这一点并从缓存中删除该项目。

通过弱引用机制,IndexReader和缓存可以断开连接。 IndexReader通过处理密钥对象来控制缓存项的有效性,缓存会自行清理。

1 个答案:

答案 0 :(得分:3)

在Java Lucene中,此特定缓存使用WeakHashMap,这意味着一旦内存压力加剧,条目将自动清除。如果在.NET中有WeakHashMap的副本,我希望它也可以使用。