SolrEventListener,更新更新

时间:2017-09-04 13:45:13

标签: solr

我目前正试图找到一种好方法来通知我,如果索引中的某些文档发生了变化。现在有些问题出现了,我希望有人可以帮助我。我使用的是Solr 6.2.1。

SolrEventListener接口有postCommit()和postSoftCommit()方法,但在文档(http://archive.apache.org/dist/lucene/solr/ref-guide/apache-solr-ref-guide-6.2.pdf)中只有关于这两个事件的信息" postCommit"和" postOptimize"。

这些如何相关?我只是设法在" postCommit"上设置了触发postCommit(),但我想在每次软提交时收到通知。我认为这是postSoftCommit()方法,但我找不到任何触发此方法调用的事件。而且只是为了好奇,触发什么触发" postOptimize"?

另外,我是否正确的假设即使,如果我设置autoCommit和autoSoftCommit,它们只会在实际更改时被触发?

是否有可能找出自上次提交以来已更改的文档数量?

我当然也对如何实现这种行为的其他建议持开放态度。

修改 为清楚起见:

如果我将fallowing添加到我的solrconfig.xml

<listener event="postCommit" class="com.solr.plugins.event.NotifyChangesEventListener"/>

com.solr.plugins.event.NotifyChangesEventListener.postCommit()按预期调用。

但是什么是正确的事件,以便调用com.solr.plugins.event.NotifyChangesEventListener.postSoftCommit()?

我试过

<listener event="postSoftCommit" class="com.solr.plugins.event.NotifyChangesEventListener"/>

但它没有任何影响。

如果我添加

,会调用哪种方法
<listener event="postOptimize" class="com.solr.plugins.event.NotifyChangesEventListener"/>

2 个答案:

答案 0 :(得分:1)

问题更新后的更新:

我认为你是对的 - 看起来postSoftCommit事件只暴露给通过调用registerSoftCommitCallback而不是通过solrconfig see the code that handles registration from solrconfig直接订阅的插件。 postOptimize调用与postCommit相同的方法,因此接口仅定义postCommit并在优化和提交时调用它。

要注册softCommitCallback,您的插件应该是SolrCoreAware,当核心注册时,它应该会收到inform的呼叫,您可以在其中呼叫registerSoftCommitCallback。我猜(我不熟悉代码或者之前已经提交了这个部分的补丁)在solrconfig.xml中添加softCommitCallback处理的补丁将被合并,因为它似乎是一种疏忽(没有评论说至少是这样的我发现了。)

每个post*()方法corresponds to an update action taken by a client for the index

  • 软提交是希望为搜索者显示文档,但在此之前不一定会保留到磁盘。让内容可见而不是等待将内容写入磁盘更为重要。这对于经常更新的繁忙索引很有用,但不必每秒写入和保持索引几次,只需使更改可见即可。添加的文档通常在集群环境中持久保存到事务日志中,因此即使事情崩溃也不会丢失所有希望。

  • 硬提交(或仅提交)会将更改持久保存到磁盘。

  • 优化会将所有段文件重写为单个大段。这通常不是必需的,因为随着分段数量的增加,Lucene将合并分段。但是如果你每晚生成一次索引,运行optimize然后分发该索引将为你提供更高性能的索引和更小的索引大小(因为没有旧的,已删除的文档将在磁盘上挥之不去)。

我不确定您指的是哪个文档,但是所有post*()处理程序are called from the DirectUpdateHandler(第705行)。

是的,只有在队列中有文档时才会触发自动提交。无需提交不存在的数据。

您可以perform a softCommit explicitly在提交请求中设置softCommit=true

我认为你不能从事件中获取添加文件的数量(..但是看看在这种情况下如何实现日志条目,因为它显示了添加的ID),但是既然你收到了搜索者,您可以从搜索者那里获取读者并查询numDocs。如果您在侦听器中保留最后一次计数,则应该能够确定事件之间的增量计数。

答案 1 :(得分:0)

自从你说过你愿意接受替代解决方案...

As of Solr 7.0, you can subscribe to a query