我们正在运行SOLR 7.2.1。
我们通过DataImportHanlder(使用clear = true)定期更新索引(完全重新索引)。
在大多数情况下,DIH运行时仍可看到索引中正常数量的文档(通常约250,000个)(因为直到导入结束才提交)。
但是,我们间歇性地遇到一个问题,即索引将突然显示仅一小部分文档(例如,其中可能有20,000个)。
我无法找到原因,但我确实怀疑原因:如果有人在我们的网站管理区域中修改了产品,则会触发该文档的SOLR更新(带有一次提交)。是否有可能通过单独的过程进行此提交,从而导致部分完成的DIH数据也被提交?如果是这样,那就可以解释为什么我们有时会在索引中得到较小的文档子集。 DIH完成后,文档计数将恢复正常。
那么,重叠的提交会相互影响吗?换句话说,是“全局”提交,还是仅影响当前进程中正在更改的数据?
我希望对此做出任何澄清。
谢谢!
账单
答案 0 :(得分:1)
事务不是在Solr中隔离的-提交或回滚将影响排队等待索引的所有文档,而不仅仅是那些属于线程的文档。这就是您发现的事情,而DIH在幕后工作时发出的提交就是发生的事情。
解决此问题的方法通常是放弃使用DIH,而是自己索引所有文档。这样您就可以完全控制索引编制过程。我会尽量避免在启动时也必须从索引中删除所有文档-如果可能,请跟踪已删除的文档(并在网络界面中将其删除时将其删除),并在以后进行额外的批量删除(如果您怀疑它们由于某种原因没有被移除。
另一个选择是对单独的索引执行DIH操作,然后在索引完成后在其中搜索的收集点使用collection alias to swap。这样,您就可以对一个单独的集合进行完整的索引,并在完成索引后,将当前索引替换为新的索引,并从刚刚构建的索引开始服务查询。
请注意,如果在通过DIH进行索引编制时更改基础数据,并且依靠直接的Solr更新来进行操作,则最终将在索引中得到错误的数据,因为将针对不同的集合/索引。
我的选择是尝试使Solr集合与您的数据库保持同步,而不必使用DIH,而是依靠正在进行的直接更新。然后,您可以使用commitWithin
允许多个线程添加文档,而不必在任何一个线程中发出明确的提交。