Solr提供了很多內(nèi)置的緩存機(jī)制來提高查詢的性能,首先回顧一下與緩存相關(guān)的基礎(chǔ)知識:
緩沖區(qū)大小及置換規(guī)則
對于查詢來說緩沖區(qū)越大當(dāng)然越好表牢,但是緩沖區(qū)太大會消耗太多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)該會更好吁峻。
命中率和置換率
命中率就是當(dāng)前查詢的結(jié)果剛好在緩沖區(qū)中的概率。命中率越高越好在张。
置換數(shù)量就是在當(dāng)前置換規(guī)則下有多少對象被置換出緩沖區(qū)用含。如果置換數(shù)量很大,就表示當(dāng)前緩沖區(qū)的太小帮匾。
緩沖對象的有效期
在Solr中啄骇,每一個緩沖區(qū)是綁定一個特定的searcher,如果當(dāng)前searcher關(guān)閉了瘟斜,那么緩沖區(qū)中的對象就會馬上失效缸夹。
Autowarming New Caches
在之前的配置中說過痪寻,Solr會在commit命令發(fā)出后就創(chuàng)建一個新的searcher,但是舊的searcher會在新searcher完全warm之后才會關(guān)閉虽惭。舊searcher的cache可以被移植到新searcher的cache中槽华,這個過程被稱為autowarming。
在Solr中的每個緩沖區(qū)都有一個叫autowarmCount的屬性趟妥,這個屬性定義了autowarm的最大對象數(shù)量或者占舊cache的比例猫态。
下面介紹幾個Solr中重要的緩沖區(qū)及它們的配置:
Filter cache
Filter可以看為是從搜索結(jié)果中進(jìn)行二次查詢的語句,并且不會影響搜索結(jié)果披摄。例如有如下查詢:
這個查詢要做的是在搜索結(jié)果中篩選出manu為Belkin的結(jié)果亲雪。假設(shè)現(xiàn)在我們要做另一個查詢,將q改為“usb”疚膊,fq的條件不變义辕,這時如果能運(yùn)用上一次的查詢結(jié)果就可以減少很多麻煩了。Filter cache就是在這時候發(fā)揮作用寓盗。
原始查詢?nèi)缦拢?/p>
查看Filter cache的狀態(tài):
將q改為Usb:
再查看filter cache:
Filter cache在solrconfig.xml中如下:
在實(shí)際應(yīng)用中灌砖,可以將autowarmCount設(shè)置為一個比較小的值,另外LFU置換規(guī)則更適合fiterCache傀蚌,推薦設(shè)置如下:
Query result cache
顧名思義基显,這個緩沖區(qū)保存的是返回的結(jié)果集。
在這個緩沖區(qū)中保存的是一個個鍵值對善炫,key為query撩幽,value為這個query返回的document ID. 當(dāng)索引改變的時候這個cache的信息也要改變,所以在warm這個cache的時候箩艺,Solr需要重新執(zhí)行query窜醉,這個過程可能會很耗時,所以可以將autowarmCount設(shè)置為一個相對比較小的值艺谆,使得新cache可以從舊的cache中warm一部分內(nèi)容榨惰,降低重新執(zhí)行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>
這兩個值一般設(shè)置為每個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
這個緩沖區(qū)保存的是Field value,一般用在需要根據(jù)字段排序的查詢舆床。如果需要進(jìn)一步了解這個緩沖區(qū)棋蚌,可以查詢Lucene文檔嫁佳。
到目前為止已經(jīng)介紹完了solrconfig.xml中比較重要的配置內(nèi)容,具體要怎么配置還需要根據(jù)實(shí)際情況進(jìn)行調(diào)整谷暮。