我目前正试图找到一种好方法来通知我,如果索引中的某些文档发生了变化。现在有些问题出现了,我希望有人可以帮助我。我使用的是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"/>
答案 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)
自从你说过你愿意接受替代解决方案...