提交

时间:2018-04-24 04:52:29

标签: caching search solr

我的应用程序具有较低的写入吞吐量,我可以管理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. 我的应用程序被大量读取需要大量缓存,而且我无法让我的缓存刷新。因此,我完全禁用了软提交。
  2. 我再次禁用opensearcher,如果我不这样做,它会使顶级缓存失效,这是不可取的
  3. 在制作中,我观察到,只要我的应用程序尝试索引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进行自动硬提交将不允许我添加的更改被反映出来。

    如果我误解了任何内容,请指出我。

    现在我的问题是:

    1. 当某些文档添加到索引并同时提供更改时,是否无法确保顶级过滤器缓存未被清除?
    2. 如果是这种情况,那么我是否需要始终依靠热身缓存来获取缓存中的某些文档?
    3. 除了热身以外,还有其他方法可以避免这种情况吗?如果他们想要构建快速可搜索的产品并且还具有一些写入吞吐量?
    4. 我已经阅读了几个文档链接和文章,但我找不到任何正确的解释在不同场景中使用的设置。如果有人能解释我做错了什么并指导我找到合适的解决方案,那将会非常有帮助。

2 个答案:

答案 0 :(得分:1)

你的理解是正确的。

  

Solr缓存与索引的特定实例相关联   搜索者,一个索引的特定视图,在该期间不会改变   那个搜索者的一生。只要那个索引搜索者正在   使用时,其缓存中的任何项目都是有效的,可供重复使用。

     

当新的搜索者被打开时,当前的搜索者继续   服务请求,而新的请求自动加热其缓存。新的   搜索者使用当前搜索者的缓存来预先填充自己的缓存。   当新的搜索器准备就绪时,它被注册为当前   搜索者并开始处理所有新的搜索请求。老搜索者   将在完成所有请求的服务后关闭。

  1. 如果您需要让搜索者访问新添加的文档,您就可以了 需要开一个新的搜索者。这可以通过使用soft来完成 使用openSearcher = true提交或硬提交。缺点是 您的顶级缓存将失效。这是你的价格 为获得知名度付出代价。

  2. 是的,热身是以前填充缓存的最佳方式 打开一个新的搜索者。你应该确定最重要的是什么     您系统中常用的查询,并让那些新的autowarm     高速缓存。

  3. 如果您不想进行实时搜索并且可以容忍这一点,则应关闭软提交并使用opensearcher = true进行硬提交。硬提交的间隔取决于您的应用程序可以容忍多少延迟。如果你不在乎在t = t1索引的文件出现,直到t = t1 + x分钟。你应该每x分钟一次。
  4. 每个选项都有缺点。你需要找出最适合你的方法。

    没有免费的午餐。

答案 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>

在提交后立即检查此缓存是有意义的。