solr-reindexer:重新索引到一个新集合的快速方法

142 阅读3分钟

如果你在使用Solr,肯定会有改变模式的时候,需要重新索引。很 多时候,真相的来源是一个数据库,所以你可以 通过JDBC源使用流式表达式来重新索引。但有时这是不可能的,或者给数据库增加了太多的负载。那么我们如何使用Solr本身作为一个源呢?

首先,你仍然可以使用流式表达式,通过 搜索源从Solr获取数据 。然而,如果你使用 qt=/export ,你需要所有的相关字段都有docValues 。这种情况很少发生--因为文本字段不能有docValues。如果你使用默认的 qt=/search,你只能得到前N个值,所以你将无法流式处理或翻阅大型数据集--否则你将耗尽内存。

一般的解决方案是 在你的数据中 运行一个 游标 ,每次获得一页文件,然后将它们重新索引到目的地。很多人最后都要写脚本来做这件事,所以我们认为我们会让你少费些力气,给你一个易于使用的、开源的、通过游标来重新索引Solr文档的脚本: solr-reindexer

在这篇文章中,我们将给你一个快速运行solr-reindexer的机会,所以你可以在几分钟内开始使用。

运行solr-reindexer

首先,一些先决条件:

  • Java 11或更高版本 ,以运行solr-reindexer JAR。
  • SolrCloud 6.x或更高版本,以支持游标。
  • 一个源集合和一个目标集合。通常情况下,你会有一个指向当前集合的别名,用新的配置创建一个新的集合,重新索引,然后在一切正常的情况下翻转这个别名。
  • 在模式中定义 一个 uniqueKey 字段 ,是游标工作的需要。除了最奇特的模式外,所有的模式都有这个字段,它通常被称为 id.
  • 从 发布页面下载solr-reindexer uber-jar

对于一个快速的重新索引,你可以简单的做:

java -jar solr-reindexer.jar -sourceCollection source_collection_name -targetCollection destination_collection_name -zkAddress localhost:2181

重新索引一个集合的子集

你可能想限制你重新索引的内容:

  • 文档:例如,有些用例有停用的文档,你可能想跳过它。要做到这一点,提供一个查询,只匹配你想要的文档,例如通过 -query "isDeactivated:false"
  • 字段:默认情况下,我们跳过 _version_ 字段,因为它是由Solr自动编写的。但你可以添加其他的,例如,如果你用 copyField的字段也被存储起来,你也会想跳过它们,通过例如 -skipFields _version_,text.尽管a copyField 通常不会被存储,如果你存储的是原始文件。

连接首选项

默认情况下,solr-reindexer连接到Zookeeper的地址是 localhost:2181.你可以提供一个以逗号分隔的Zookeeper地址列表,用于冗余。另外,如果请求失败,它将以5秒的间隔重试最多10次。它们都可以通过 -retries-retryInterval 分别配置。

关于参数的完整列表和它们的默认值,请看下面的输出 -help.

贡献和下一步工作

总是有改进的余地,因为solr-reindexer是Apache2许可的,所以我们邀请你来贡献。在写这篇文章的时候,支持认证和从远程集群重新索引将是最重要的功能补充。我们还可以通过增加一个队列和在多个线程上写入,使重索引的速度更快。我们也可以把读取分成几个部分(例如,按分片或按uniqueId)来并行化。