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中比较重要的配置内容,具体要怎么配置还需要根据实际情况进行调整。
网友评论