我的应用程序具有较低的写入吞吐量,我可以管理2-3分钟的更改,以反映在solr搜索结果中。
目前我通过我的索引应用程序提交(在每批文档之后),并在solr端配置以下内容:
solr.autoSoftCommit.maxTime : -1 (disabling auto soft commit)
solr.autoCommit.maxTime : 300000 (5 mins of hard auto commit interval)
opensearcher : false
选择配置的原因来自于我对以下内容的理解:
在制作中,我观察到,只要我的应用程序尝试索引1个文档(或批处理),然后发出提交语句(从我的应用程序),我的所有顶级缓存都会被清除。
我想也许只是依靠硬自动提交会有所帮助,但根据这个stack overflow link
硬提交是关于持久性的,软提交是关于可见性的。这里有两种风格,openSearcher = true和openSearcher = false。首先,我们将讨论两种情况下会发生什么。如果openSearcher = true或openSearcher = false,则以下结果最为重要:
tlog被截断:启动新的tlog。旧的tlogs将是 如果更新,关闭的tlog中有超过100个文档,则删除。 当前索引段已关闭并刷新。背景细分 合并可能会启动。以上都发生在所有硬提交上。那 离开openSearcher设置
openSearcher = true: Solr / Lucene搜索者重新开放,所有 缓存无效。自动装载完成等。以前是 只有这样你才能看到新添加的文件。
openSearcher = false:除上述四点外,没有其他事情发生。寻找 文档,软提交是必要的。
总而言之,软提交将刷新缓存,因此将使用opensearcher = true进行自动硬提交。虽然使用opensearcher = false进行自动硬提交将不允许我添加的更改被反映出来。
如果我误解了任何内容,请指出我。
现在我的问题是:
我已经阅读了几个文档链接和文章,但我找不到任何正确的解释在不同场景中使用的设置。如果有人能解释我做错了什么并指导我找到合适的解决方案,那将会非常有帮助。
答案 0 :(得分:1)
你的理解是正确的。
Solr缓存与索引的特定实例相关联 搜索者,一个索引的特定视图,在该期间不会改变 那个搜索者的一生。只要那个索引搜索者正在 使用时,其缓存中的任何项目都是有效的,可供重复使用。
当新的搜索者被打开时,当前的搜索者继续 服务请求,而新的请求自动加热其缓存。新的 搜索者使用当前搜索者的缓存来预先填充自己的缓存。 当新的搜索器准备就绪时,它被注册为当前 搜索者并开始处理所有新的搜索请求。老搜索者 将在完成所有请求的服务后关闭。
如果您需要让搜索者访问新添加的文档,您就可以了 需要开一个新的搜索者。这可以通过使用soft来完成 使用openSearcher = true提交或硬提交。缺点是 您的顶级缓存将失效。这是你的价格 为获得知名度付出代价。
是的,热身是以前填充缓存的最佳方式 打开一个新的搜索者。你应该确定最重要的是什么 您系统中常用的查询,并让那些新的autowarm 高速缓存。
每个选项都有缺点。你需要找出最适合你的方法。
没有免费的午餐。
答案 1 :(得分:0)
来自solr-user列表的应对 您可以尝试使用更实时的分段缓存 它应该像q = {!parent = COLOR:Blue v =''}而不是q = COLOR:Blue 确保在solrconfig.xml中具有以下定义,此再生器应在搜索器之间传输过滤器位集。
<query>
<cache name="perSegFilter"
class="solr.LRUCache"
size="100"
initialSize="10"
autowarmCount="100%"
regenerator="solr.NoOpRegenerator"/>
</query>
在提交后立即检查此缓存是有意义的。