Solr提供了很多內(nèi)置的緩存機(jī)制來提高查詢的性能,首先回顧一下與緩存相關(guān)的基礎(chǔ)知識(shí):
緩沖區(qū)大小及置換規(guī)則
對于查詢來說緩沖區(qū)越大當(dāng)然越好,但是緩沖區(qū)太大會(huì)消耗太多JVM內(nèi)存。當(dāng)緩沖區(qū)滿了之后就需要有一定的置換規(guī)則對緩沖區(qū)里的對象進(jìn)行置換(回顧一下操作系統(tǒng)里面的緩沖區(qū)置換規(guī)則),在Solr里面主要有兩種置換規(guī)則:Least Recently Used和Least Frequently Used,這里就不詳細(xì)解釋了,對于大部分搜索引擎來說,用Least Frequently Used的效果應(yīng)該會(huì)更好。
命中率和置換率
命中率就是當(dāng)前查詢的結(jié)果剛好在緩沖區(qū)中的概率。命中率越高越好。
置換數(shù)量就是在當(dāng)前置換規(guī)則下有多少對象被置換出緩沖區(qū)。如果置換數(shù)量很大,就表示當(dāng)前緩沖區(qū)的太小。
緩沖對象的有效期
在Solr中,每一個(gè)緩沖區(qū)是綁定一個(gè)特定的searcher,如果當(dāng)前searcher關(guān)閉了,那么緩沖區(qū)中的對象就會(huì)馬上失效。
Autowarming New Caches
在之前的配置中說過,Solr會(huì)在commit命令發(fā)出后就創(chuàng)建一個(gè)新的searcher,但是舊的searcher會(huì)在新searcher完全warm之后才會(huì)關(guān)閉。舊searcher的cache可以被移植到新searcher的cache中,這個(gè)過程被稱為autowarming。
在Solr中的每個(gè)緩沖區(qū)都有一個(gè)叫autowarmCount的屬性,這個(gè)屬性定義了autowarm的最大對象數(shù)量或者占舊cache的比例。
下面介紹幾個(gè)Solr中重要的緩沖區(qū)及它們的配置:
Filter cache
Filter可以看為是從搜索結(jié)果中進(jìn)行二次查詢的語句,并且不會(huì)影響搜索結(jié)果。例如有如下查詢:

這個(gè)查詢要做的是在搜索結(jié)果中篩選出manu為Belkin的結(jié)果。假設(shè)現(xiàn)在我們要做另一個(gè)查詢,將q改為“usb”,fq的條件不變,這時(shí)如果能運(yùn)用上一次的查詢結(jié)果就可以減少很多麻煩了。Filter cache就是在這時(shí)候發(fā)揮作用。
原始查詢?nèi)缦拢?/p>

查看Filter cache的狀態(tài):

將q改為Usb:

再查看filter cache:

Filter cache在solrconfig.xml中如下:

在實(shí)際應(yīng)用中,可以將autowarmCount設(shè)置為一個(gè)比較小的值,另外LFU置換規(guī)則更適合fiterCache,推薦設(shè)置如下:

Query result cache
顧名思義,這個(gè)緩沖區(qū)保存的是返回的結(jié)果集。

在這個(gè)緩沖區(qū)中保存的是一個(gè)個(gè)鍵值對,key為query,value為這個(gè)query返回的document ID. 當(dāng)索引改變的時(shí)候這個(gè)cache的信息也要改變,所以在warm這個(gè)cache的時(shí)候,Solr需要重新執(zhí)行query,這個(gè)過程可能會(huì)很耗時(shí),所以可以將autowarmCount設(shè)置為一個(gè)相對比較小的值,使得新cache可以從舊的cache中warm一部分內(nèi)容,降低重新執(zhí)行query的消耗。
Query Result Window Size和Query Result Max Docs Size
這兩個(gè)屬性在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>
這兩個(gè)值一般設(shè)置為每個(gè)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與其對應(yīng)的documentID,而不是對應(yīng)的Document的內(nèi)容,Document cache就是用來緩存從硬盤中讀出來的document中的內(nèi)容。那么是否應(yīng)該將所有出現(xiàn)在query result cache中出現(xiàn)過的document都緩存進(jìn)來?答案是否定的,不過對于那種變化不頻繁的搜索引擎來說這樣做也未必不可。
Field value cache
這個(gè)緩沖區(qū)保存的是Field value,一般用在需要根據(jù)字段排序的查詢。如果需要進(jìn)一步了解這個(gè)緩沖區(qū),可以查詢Lucene文檔。
到目前為止已經(jīng)介紹完了solrconfig.xml中比較重要的配置內(nèi)容,具體要怎么配置還需要根據(jù)實(shí)際情況進(jìn)行調(diào)整。