<query />
在标签<query/>里面可以进行一些优化搜索的配置。在Solr的查询过程中,运用到一个叫searcher的组件,在一个特定的时间只能有一个“active”的searcher。这个active searcher在Lucene索引中有一个只读的映射。当新的document加入到Solr的时候,当前的searcher在搜索结果中是看不到这个新加的document的。那么问题就来了:怎么样才能让新添加的文件出现在搜索结果中?一个解决这个问题的办法就是关闭当前的searcher并对新的索引文件打开一个新的searcher。
在admin界面中,查看collection1的Plugins/Status,点击core:
第一行展示的就是当前的Searcher,当我们重新对文件建立索引,在example的exampledocs下运用:
Java -jar post.jar *.xml:
刷新界面:
可以看到Searcher改变了。这是因为post.jar提交个commit指令。从上面的示例我们知道commit指令可以创建一个新的searcher,使得可以检索到最新的文件,当新searcher创建的时候要先销毁旧的searcher。这时候如果还有基于旧searcher的查询在进行中,Solr就要等待所有进行中的查询结束。然后,所有基于当前searcher的cached对象都要失效。因为之前建立起来的cache都失效了,所以建立一个新的searcher可能是很耗时的。假设一个用户在返回的结果中进行翻页操作,当用户从第二页翻到第三页的时候一个新的searcher打开了,此时用户就会一直等待第三页的加载,但是这时候之前加载的document都已经失效,所以就会让用户感觉到加载很慢。
对于上述问题,Solr提供了一系列的工具,Solr在建立一个searcher的时候有称为warming的概念,即让新的searcher在后台建立,并让当前的searcher继续工作直到后台的searcher完全warm。
Warming a new searcher
Solr运用这个策略来使得在一段时间内还是返回旧的结果,而避免用户因为新建searcher而降低查询的性能。有两种warming的策略:autowarming new caches from the old caches(从旧的cache中创建新的cache)和execute cache-warming queries(重新执行一些queries来填充新的cache)。
Cache-warming queries是一种preconfigured query来构建新searcher的cache。
上面的配置定义了一系列的queries当newSearcher事件出现的时候就执行(如在commit之后)。
<useColdSearcher/>
如果为false,那么Solr就会阻塞直到warming searcher完成所有的warming queries。
<useColdSearcher>false</useColdSearcher>
如果为true,Solr会马上注册一个warming searcher。
<maxWarmingSearchers>
定义在后台可以同时warming的最大searcher数量。默认值为2.