Solr基本配置(四)——缓冲区管理

Solr提供了很多内置的缓存机制来提高查询的性能,首先回顾一下与缓存相关的基础知识:

缓冲区大小及置换规则

对于查询来说缓冲区越大当然越好,但是缓冲区太大会消耗太多JVM内存。当缓冲区满了之后就需要有一定的置换规则对缓冲区里的对象进行置换(回顾一下操作系统里面的缓冲区置换规则),在Solr里面主要有两种置换规则:Least Recently Used和Least Frequently Used,这里就不详细解释了,对于大部分搜索引擎来说,用Least Frequently Used的效果应该会更好。

命中率和置换率

命中率就是当前查询的结果刚好在缓冲区中的概率。命中率越高越好。
  置换数量就是在当前置换规则下有多少对象被置换出缓冲区。如果置换数量很大,就表示当前缓冲区的太小。

缓冲对象的有效期

在Solr中,每一个缓冲区是绑定一个特定的searcher,如果当前searcher关闭了,那么缓冲区中的对象就会马上失效。

Autowarming New Caches

在之前的配置中说过,Solr会在commit命令发出后就创建一个新的searcher,但是旧的searcher会在新searcher完全warm之后才会关闭。旧searcher的cache可以被移植到新searcher的cache中,这个过程被称为autowarming。
  在Solr中的每个缓冲区都有一个叫autowarmCount的属性,这个属性定义了autowarm的最大对象数量或者占旧cache的比例。

下面介绍几个Solr中重要的缓冲区及它们的配置:

Filter cache

Filter可以看为是从搜索结果中进行二次查询的语句,并且不会影响搜索结果。例如有如下查询: 


这个查询要做的是在搜索结果中筛选出manu为Belkin的结果。假设现在我们要做另一个查询,将q改为“usb”,fq的条件不变,这时如果能运用上一次的查询结果就可以减少很多麻烦了。Filter cache就是在这时候发挥作用。
原始查询如下:

查看Filter cache的状态:

将q改为Usb:

再查看filter cache:

Filter cache在solrconfig.xml中如下:

在实际应用中,可以将autowarmCount设置为一个比较小的值,另外LFU置换规则更适合fiterCache,推荐设置如下:

Query result cache

顾名思义,这个缓冲区保存的是返回的结果集。


在这个缓冲区中保存的是一个个键值对,key为query,value为这个query返回的document ID. 当索引改变的时候这个cache的信息也要改变,所以在warm这个cache的时候,Solr需要重新执行query,这个过程可能会很耗时,所以可以将autowarmCount设置为一个相对比较小的值,使得新cache可以从旧的cache中warm一部分内容,降低重新执行query的消耗。

Query Result Window Size和Query Result Max Docs Size
这两个属性在solrconfig.xml中描述如下:

 <!-- Result Window Size
        An optimization for use with the queryResultCache.  When a search
        is requested, a superset of the requested number of document ids
        are collected.  For example, if a search for a particular query
        requests matching documents 10 through 19, and queryWindowSize is 50,
        then documents 0 through 49 will be collected and cached.  Any further
        requests in that range can be satisfied via the cache.  
     -->
   <queryResultWindowSize>20</queryResultWindowSize>

   <!-- Maximum number of documents to cache for any entry in the
        queryResultCache. 
     -->
   <queryResultMaxDocsCached>200</queryResultMaxDocsCached>

这两个值一般设置为每个page大小的2-3倍。

Enable Lazy Field Loading

该字段描述如下:

<!-- Lazy Field Loading
         If true, stored fields that are not requested will be loaded
         lazily.  This can result in a significant speed improvement
         if the usual case is to not load all stored fields,
         especially if the skipped fields are large compressed text
         fields.
    -->
    <enableLazyFieldLoading>true</enableLazyFieldLoading>

Document cache

之前介绍的query result cache保存的是query与其对应的documentID,而不是对应的Document的内容,Document cache就是用来缓存从硬盘中读出来的document中的内容。那么是否应该将所有出现在query result cache中出现过的document都缓存进来?答案是否定的,不过对于那种变化不频繁的搜索引擎来说这样做也未必不可。

Field value cache

这个缓冲区保存的是Field value,一般用在需要根据字段排序的查询。如果需要进一步了解这个缓冲区,可以查询Lucene文档。

到目前为止已经介绍完了solrconfig.xml中比较重要的配置内容,具体要怎么配置还需要根据实际情况进行调整。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容