<query />
在標(biāo)簽<query/>里面可以進行一些優(yōu)化搜索的配置。在Solr的查詢過程中,運用到一個叫searcher的組件,在一個特定的時間只能有一個“active”的searcher。這個active searcher在Lucene索引中有一個只讀的映射。當(dāng)新的document加入到Solr的時候,當(dāng)前的searcher在搜索結(jié)果中是看不到這個新加的document的。那么問題就來了:怎么樣才能讓新添加的文件出現(xiàn)在搜索結(jié)果中?一個解決這個問題的辦法就是關(guān)閉當(dāng)前的searcher并對新的索引文件打開一個新的searcher。
在admin界面中,查看collection1的Plugins/Status,點擊core:

第一行展示的就是當(dāng)前的Searcher,當(dāng)我們重新對文件建立索引,在example的exampledocs下運用:
Java -jar post.jar *.xml:
刷新界面:

可以看到Searcher改變了。這是因為post.jar提交個commit指令。從上面的示例我們知道commit指令可以創(chuàng)建一個新的searcher,使得可以檢索到最新的文件,當(dāng)新searcher創(chuàng)建的時候要先銷毀舊的searcher。這時候如果還有基于舊searcher的查詢在進行中,Solr就要等待所有進行中的查詢結(jié)束。然后,所有基于當(dāng)前searcher的cached對象都要失效。因為之前建立起來的cache都失效了,所以建立一個新的searcher可能是很耗時的。假設(shè)一個用戶在返回的結(jié)果中進行翻頁操作,當(dāng)用戶從第二頁翻到第三頁的時候一個新的searcher打開了,此時用戶就會一直等待第三頁的加載,但是這時候之前加載的document都已經(jīng)失效,所以就會讓用戶感覺到加載很慢。
對于上述問題,Solr提供了一系列的工具,Solr在建立一個searcher的時候有稱為warming的概念,即讓新的searcher在后臺建立,并讓當(dāng)前的searcher繼續(xù)工作直到后臺的searcher完全warm。
Warming a new searcher
Solr運用這個策略來使得在一段時間內(nèi)還是返回舊的結(jié)果,而避免用戶因為新建searcher而降低查詢的性能。有兩種warming的策略:autowarming new caches from the old caches(從舊的cache中創(chuàng)建新的cache)和execute cache-warming queries(重新執(zhí)行一些queries來填充新的cache)。
Cache-warming queries是一種preconfigured query來構(gòu)建新searcher的cache。

上面的配置定義了一系列的queries當(dāng)newSearcher事件出現(xiàn)的時候就執(zhí)行(如在commit之后)。
<useColdSearcher/>
如果為false,那么Solr就會阻塞直到warming searcher完成所有的warming queries。
<useColdSearcher>false</useColdSearcher>
如果為true,Solr會馬上注冊一個warming searcher。
<maxWarmingSearchers>
定義在后臺可以同時warming的最大searcher數(shù)量。默認值為2.