Solr用于重新索引大型文档语料库

gst*_*his 5 indexing solr clustered-index bigdata

我们正在寻找一些建议,围绕Solr系统地重新索引一个不断增长的文档集(现在有数千万,一年中有数亿),而不会使当前运行的索引失效.需要在定期基础上重新编制索引,因为:

  • 围绕搜索需要额外模式字段的现有语料库引入了新功能,这些字段我们无法提前预期
  • 语料库跨多个分片索引.当它超过某个阈值时,我们需要创建更多的分片并在所有分片上均匀地重新平衡文档(SolrCloud似乎还不支持).

当前索引会收到非常频繁的更新和添加,需要在几分钟内进行搜索.因此,在批量脱机中重新索引语料库的方法实际上不起作用,因为批次完成时,新文档将可用.

我们目前正在研究的方法是:

  • 在旧群集仍可供搜索时,创建新的分片集群并批量重新索引.不属于重新编制索引的批处理的新文档将发送到旧群集和新群集.准备切换时,将负载均衡器指向新群集.
  • 使用CoreAdmin:为每个分片生成一个新核心,并将重新索引的批处理发送到新核心.不属于重新编制索引的批处理的新文档将发送到旧核心和新核心.准备切换时,使用CoreAdmin动态交换核心.

我们很感激,如果人们可以确认或者在这些方法中的任何一个或所有方法中找到漏洞.一个比另一个更合适吗?还是我们完全脱了?先感谢您.

Jas*_*mer 2

这可能不适用于你们,但我会提供解决这个问题的方法。

我们的 Solr 设置目前是单核。将来我们将添加更多核心,但绝大多数数据都会写入单个核心。

考虑到这一点,分片并不真正适用于我们。我研究了分布式搜索——分割数据并在不同的服务器上运行不同的数据片段。对我来说,这似乎让事情变得太复杂了。这将使备份/恢复变得更加困难,并且在执行分布式搜索时您最终会失去某些功能。

我们最终采用的方法是非常简单的集群主/从设置。

每个集群由一个主数据库和两个负载均衡的 solr 从数据库组成。所有新数据都写入主数据库,从数据库配置为每 5 分钟同步一次新数据。在正常情况下,这是一个非常好的设置。重新索引操作发生在主站上,当发生这种情况时,仍然可以读取从站。

当发生主要的重新索引操作时,我从负载均衡器中删除一个从站,并关闭另一个从站的轮询。因此,面向客户的 Solr 数据库现在未与主数据库同步,而另一个正在更新。重新索引完成并且脱机从属数据库同步后,我将其添加回负载均衡器,从负载均衡器中删除另一个从属数据库,然后重新配置它以与主数据库同步。

到目前为止,这效果非常好。目前,我们的数据库中有大约 500 万个文档,并且这个数字在多个集群中会扩展得更高。

希望这可以帮助!