重新索引

有几种类型的 Solr 配置更改需要您重新索引数据,尤其是架构更改。

这些更改包括编辑字段或字段类型的属性;添加字段或复制字段规则;升级 Solr;以及更改某些系统配置属性。

务必注意,未能重新索引会对 Solr 或用户查找所需内容产生明显和微妙的影响。

在此上下文中,“重新索引”意味着首先删除现有索引,然后重复从记录系统中获取整个语料库所用的流程。强烈建议 Solr 用户采用一致、可重复的索引流程,以便在需要时重新创建索引。

在不确保已删除所有文档和 Lucene 段的情况下重新获取语料库中的所有文档不足够,请参阅部分 重新索引策略

建议在重大升级期间重新索引,因此除了介绍哪些类型的配置更改应触发重新索引之外,本部分还将介绍重新索引的策略。

需要重新索引的更改

架构更改

除了极少数例外,对集合架构的更改需要重新索引。这是因为许多可用选项仅在索引过程中应用。Solr 无法在不重新索引数据的情况下实现所需的更改。

要了解为什么需要重新索引的一般原因,了解 Solr 架构与底层 Lucene 索引之间的关系非常有帮助。Lucene 不使用架构,架构是仅限于 Solr 的概念。当您更改 Solr 架构时,Lucene 索引不会以任何方式修改。

这意味着有许多类型的模式更改无法通过简单地修改 Solr 的模式来反映在索引中。这不同于使用模式的大多数数据库模型。在索引时,Solr 的模式充当索引文档的规则手册,通过告诉 Lucene 如何解释正在发送的数据。一旦文档进入 Lucene,Solr 的模式将无法控制底层数据结构。

此外,更改模式版本属性等同于更改字段类型属性。此类更改通常仅在重大升级期间或由于重大升级而进行。

更改字段和字段类型属性

当您通过添加字段、删除字段或更改字段或字段类型定义来更改模式时,您通常这样做是为了让这些更改改变搜索文档的方式。这些更改的全部影响不会反映在整个语料库中,直到所有文档都重新编入索引。

必须重新编入索引才能反映字段类型属性中描述的任何字段/字段类型属性在所有文档中的更改。

不建议更改影响索引的字段属性而不重新编入索引。仅在透彻了解后果的情况下才应尝试这样做。对用户的负面影响可能不会立即显现。

更改字段分析

除了特定的字段级属性之外,分析链也配置在字段类型上,并在索引和查询时应用。

如果为字段的查询和索引事件定义了单独的分析链,并且您更改查询时间分析链,则无需重新编入索引。

在几乎所有情况下,对索引时间分析链的任何更改都需要重新编入索引。

Solrconfig 更改

识别 solrconfig.xml 中会改变数据摄取方式并因此需要重新编入索引的更改并不简单。一般规则是“任何改变存储在索引中的内容都需要重新编入索引”。以下是几个已知的示例。

solrconfig.xml 中的参数 luceneMatchVersion 控制 Solr 与 Lucene 的兼容性。由于此参数可能会在幕后更改分析规则,因此建议在更改此参数时始终重新编入索引。通常,这仅在与重大升级结合时才更改。

如果您对 Solr 的更新请求处理器进行了更改,通常是因为您希望更改更新请求(文档)的处理(索引)方式。在这种情况下,我们建议您重新索引文档以实现所做的更改,就像更改架构一样。

同样,如果您更改了solrconfig.xml中的codecFactory参数,强烈建议您计划重新索引文档以避免意外行为。

升级

在主要版本之间进行升级(例如,从 7.x 版本升级到 8.x)时,最佳做法是始终重新索引数据。原因是默认字段类型定义或底层代码中可能会发生细微的更改。

Lucene 努力确保一个主要版本向后兼容,因此 Solr 8x 可以使用 Solr 7x 创建的索引。但是,鉴于此保证适用于 Solr X-2(本例中为 Solr 6x),我们仍然建议在从 Solr X-1 迁移到 Solr X 时完全重新索引。

如果您没有在从一个次要版本升级到另一个次要版本(例如,从 7.x 升级到更高版本的 7.x)时更改架构,则通常可以跳过重新索引文档。但是,在升级到主要版本时,您应该计划重新索引文档。
当使用比 X-1 更旧的 Solr 版本生成的索引进行升级时,您必须始终重新索引语料库。例如,如果您要升级到 Solr 8x,则必须删除 Solr 6x 使用过的索引,并按照以下步骤重新导入。会写入一个标记,标识用于导入第一个文档的 Lucene 版本。除非索引被完全删除,否则该标记将永久保留在索引中。如果 Lucene 发现一个标记比 X-1 主要版本更旧,它将拒绝打开索引。

重新索引策略

有几种方法可以执行重新索引。

下面描述的策略可确保完全删除 Lucene 索引,以便您可以重新创建它以适应您的更改。它们允许您重新创建 Lucene 索引,而无需让 Lucene 段保留过时数据。

Lucene 索引是一个专为快速搜索设计的有损抽象。一旦将文档添加到索引中,就无法假设原始数据可用。因此,Lucene 无法“修复”现有文档以反映架构的更改,必须重新索引它们。

有许多技术原因使得在不首先删除整个语料库的情况下正确地重新导入所有文档变得困难且容易出错。

因此,由于必须重新提取所有文档才能确保抽象忠实地反映所有文档的新架构,我们建议在确保没有旧的 Lucene 段或重新索引到新集合后删除所有文档。

删除所有文档

最佳方法是先从索引中删除所有内容,然后重新索引数据。可以使用“按查询删除”删除所有文档,例如

curl -X POST -H 'Content-Type: application/json' --data-binary '{"delete":{"query":"*:*" }}' http://localhost:8983/solr/my_collection/update

验证所有文档已被删除非常重要,因为这可确保 Lucene 索引段也已被删除。

要验证索引中没有段,请查看 data/index 目录并确认它没有段文件。由于数据目录可以自定义,请参阅部分 使用 dataDir 参数指定索引数据的位置 以了解索引文件的位置。

请注意,您需要验证集群中每个节点上的每个分片和每个副本中的索引是否已被删除。仅查询文档数量是不够的,因为您可能没有文档,但仍然有索引段。

清除索引后,您可以通过重新运行原始索引进程来开始重新索引。

此方法的替代方法是使用更新的架构删除并重新创建集合,然后在重新索引过程期间可以使集合脱机的情况下重新索引。

索引到另一个集合

另一种方法是索引到新集合并使用 Solr 的 集合别名 功能在不宕机的情况下将应用程序无缝地指向新集合。

此选项仅适用于在 SolrCloud 模式下运行的 Solr 安装。

使用此方法,您将把文档编入使用您的更改的新集合中,并且在编制索引和测试完成后,创建一个将您的前端指向新集合的别名。从那时起,新查询和更新将无缝地路由到新集合。

一旦别名就位,并且您确信不再需要旧数据,您可以使用 Collections API DELETE 命令删除旧集合。

此选项的一个优点是,如果您发现我们的测试未发现的问题,您可以切换回旧集合。当然,此选项可能需要更多资源,直到可以删除旧集合。

不需要重新索引的更改

不需要或强烈表明需要重新索引的更改类型是不影响索引的更改。

创建或修改请求处理程序、搜索组件和 solrconfig.xml 的其他元素不需要重新索引。

集群和核心管理操作(例如添加节点、副本或新核心或拆分分片)也不需要重新索引。