Solr 方法来重新索引大型文档语料库

Posted

技术标签:

【中文标题】Solr 方法来重新索引大型文档语料库【英文标题】:Solr approaches to re-indexing large document corpus 【发布时间】:2011-08-22 02:48:42 【问题描述】:

我们正在寻找一些关于在 Solr 中系统地重新索引不断增长的文档语料库(现在数千万,一年内数亿)而不降低当前运行的索引的建议。需要定期重新索引,因为:

新功能介绍围绕 搜索现有的语料库 需要额外的架构字段 我们不能总是预料到 前进 语料库跨多个索引 碎片。当它长到一定程度时 门槛,我们需要创造更多 分片和重新平衡文档 均匀地分布在所有人身上(其中 SolrCloud 似乎还没有 支持)。

当前索引接收非常频繁的更新和添加,需要在几分钟内可供搜索。因此,离线批量重新索引语料库的方法实际上并不奏效,因为当批处理完成时,新文档将可用。

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

创建一个新的分片集群并 在旧的时候批量重新索引 集群仍然可用 搜索。没有的新文件 发送重新索引批次的一部分 旧集群和新集群 簇。准备切换时,点 新集群的负载均衡器。 使用 CoreAdmin:每次生成一个新核心 分片并发送重新索引的批次 到新的核心。新的文件 不是重新索引批次的一部分 被发送到旧核心和 新的核心。准备切换时, 使用 CoreAdmin 动态交换 核心。

如果人们能够确认或在其中一种或所有这些方法中找出漏洞,我们将不胜感激。一个比另一个更合适吗?还是我们完全关闭了?提前谢谢你。

【问题讨论】:

作为一个拥有数百万文档索引的人,我考虑过一种类似于您的“使用 CoreAdmin:”选项的方法。我认为你在正确的轨道上。 谢谢弗兰克。很高兴知道我还没有完全离开。 是的...CoreAdmin 是一种非常理智的方法。 【参考方案1】:

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

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

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

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

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

当发生重大的重新索引操作时,我会从负载均衡器中移除一个从属服务器,并关闭另一台服务器的轮询。因此,面向客户的 Solr 数据库现在没有与主数据库同步,而另一个正在更新。一旦重新索引完成并且离线从数据库同步,我将它添加回负载均衡器,从负载均衡器中删除另一个从数据库,然后重新配置它以与主数据库同步。

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

希望这会有所帮助!

【讨论】:

嘿,杰森,非常感谢分享这个。我们的文档数量是您的数倍,因此我们已经开始分片以保持性能。我们也在研究分离 r/w 的主/从方法;不过,我们的首要任务是在接受新更新的同时允许重新编制索引。我们的索引会不断更新,有时每分钟更新几次,我们确实需要在几分钟内将这些更新提供给客户,即使在重大的重新索引期间也是如此。因此,我们现在正在根据需要实施 CoreAdmin 方法。

以上是关于Solr 方法来重新索引大型文档语料库的主要内容,如果未能解决你的问题,请参考以下文章

大型分类文档语料库

论文泛读67渐进式预训练密集语料库索引用于开放域问答

从大型语料库生成 n-gram

gensim文档相似性:如何从最相似的结果中获取文档标题?

Solr-5.3.1 dataimport 导入mysql数据

使用 Sci-Kit 学习对具有大型语料库的文本进行分类