SOLR DataImportHanlder (DIH) 完整索引 - 有时我们的索引在导入过程中显示接近零的文档
SOLR DataImportHanlder (DIH) Full Indexing - sometimes our index shows near-zero documents during import
我们是 运行 SOLR 7.2.1.
我们通过 DataImportHanlder(使用 clear=true)定期更新我们的索引(完全重新索引)。
大多数时候,我们索引中正常数量的文档(通常约为 250,000)仍然可见,而 DIH 是 运行(因为它直到导入结束才提交)。
然而,间歇性地,我们遇到一个问题,即索引突然只显示文档的一小部分(例如,可能有 20,000 个)。
我无法追查到这个问题的来源,但我确实怀疑原因:如果有人在我们的网站管理区域修改产品,那将触发对该文档的 SOLR 更新(提交)。是否有可能通过一个单独的进程提交此提交,然后将导致部分完成的 DIH 数据也被提交?如果是这样,那就可以解释为什么我们有时会在索引中得到一个较小的文档子集。当 DIH 完成后,文档计数 returns 正常。
那么,重叠提交会相互影响吗?也就是说,是一个commit"global",还是只影响当前进程中正在改变的数据?
如有任何澄清,我将不胜感激。
谢谢!
比尔
事务在 Solr 中不是孤立的 - 提交或回滚将影响为索引排队的所有文档,而不仅仅是那些属于线程的文档。这是您自己发现的,DIH 在幕后工作时发出的提交就是正在发生的事情。
解决这个问题的方法通常是放弃使用 DIH,而是自己索引所有文档。这将使您完全控制索引编制过程。我会尽量避免在开始时从索引中删除所有文档 - 如果可能的话,跟踪已删除的文档(并在它们在 Web 界面中删除时删除它们)并稍后进行额外的批量删除(如果您怀疑它们由于某种原因没有被删除)。
另一种选择是在单独的索引上执行 DIH 操作,然后在索引完成后使用 collection alias to swap 搜索到的集合点。这允许您对一个单独的集合进行完整的索引,当它完成时,将当前的索引换成新的索引,并从您刚刚构建的索引开始提供查询服务。
请注意,如果您在通过 DIH 建立索引时更改基础数据,并依赖直接 Solr 更新来完成,您最终会在索引中得到错误的数据,因为直接更新将是针对不同的集合/索引执行。
我的选择是尝试使 Solr 集合与您的数据库保持同步,而不必使用 DIH - 而是依赖于直接更新。然后,您可以使用 commitWithin
允许多个线程添加文档,而无需在任一线程中发出显式提交。
我们是 运行 SOLR 7.2.1.
我们通过 DataImportHanlder(使用 clear=true)定期更新我们的索引(完全重新索引)。
大多数时候,我们索引中正常数量的文档(通常约为 250,000)仍然可见,而 DIH 是 运行(因为它直到导入结束才提交)。
然而,间歇性地,我们遇到一个问题,即索引突然只显示文档的一小部分(例如,可能有 20,000 个)。
我无法追查到这个问题的来源,但我确实怀疑原因:如果有人在我们的网站管理区域修改产品,那将触发对该文档的 SOLR 更新(提交)。是否有可能通过一个单独的进程提交此提交,然后将导致部分完成的 DIH 数据也被提交?如果是这样,那就可以解释为什么我们有时会在索引中得到一个较小的文档子集。当 DIH 完成后,文档计数 returns 正常。
那么,重叠提交会相互影响吗?也就是说,是一个commit"global",还是只影响当前进程中正在改变的数据?
如有任何澄清,我将不胜感激。
谢谢!
比尔
事务在 Solr 中不是孤立的 - 提交或回滚将影响为索引排队的所有文档,而不仅仅是那些属于线程的文档。这是您自己发现的,DIH 在幕后工作时发出的提交就是正在发生的事情。
解决这个问题的方法通常是放弃使用 DIH,而是自己索引所有文档。这将使您完全控制索引编制过程。我会尽量避免在开始时从索引中删除所有文档 - 如果可能的话,跟踪已删除的文档(并在它们在 Web 界面中删除时删除它们)并稍后进行额外的批量删除(如果您怀疑它们由于某种原因没有被删除)。
另一种选择是在单独的索引上执行 DIH 操作,然后在索引完成后使用 collection alias to swap 搜索到的集合点。这允许您对一个单独的集合进行完整的索引,当它完成时,将当前的索引换成新的索引,并从您刚刚构建的索引开始提供查询服务。
请注意,如果您在通过 DIH 建立索引时更改基础数据,并依赖直接 Solr 更新来完成,您最终会在索引中得到错误的数据,因为直接更新将是针对不同的集合/索引执行。
我的选择是尝试使 Solr 集合与您的数据库保持同步,而不必使用 DIH - 而是依赖于直接更新。然后,您可以使用 commitWithin
允许多个线程添加文档,而无需在任一线程中发出显式提交。