重新索引
对 Solr 配置的几种类型的更改需要您重新索引数据,尤其是对模式的更改。
这些更改包括编辑字段或字段类型的属性;添加字段或复制字段规则;升级 Solr;以及更改某些系统配置属性。
重要的是要注意,未能重新索引可能会对 Solr 或用户查找所需内容产生明显和细微的影响。
此处的“重新索引”意味着首先删除现有索引并重复您用来从记录系统摄取整个语料库的过程。强烈建议 Solr 用户拥有一致、可重复的索引过程,以便在需要时可以重新创建索引。
在未首先确保所有文档和 Lucene 段都已被删除的情况下,重新摄取语料库中的所有文档是不足够的,请参阅重新索引策略部分。 |
建议在主要升级期间重新索引,因此除了涵盖应触发重新索引的配置更改类型外,本节还将涵盖重新索引的策略。
需要重新索引的更改
模式更改
除了极少数例外,对集合模式的更改需要重新索引。这是因为许多可用选项仅在索引过程中应用。Solr 无法在不重新索引数据的情况下实现所需的更改。
要理解为什么始终需要重新索引的一般原因,了解 Solr 的模式与底层 Lucene 索引之间的关系很有帮助。Lucene 不使用模式,模式是 Solr 独有的概念。当您更改 Solr 的模式时,Lucene 索引不会以任何方式修改。
这意味着有许多类型的模式更改无法简单地通过修改 Solr 的模式来反映在索引中。这与大多数使用模式的数据库模型不同。在索引时,Solr 的模式就像一个索引文档的规则手册,告诉 Lucene 如何解释发送的数据。一旦文档进入 Lucene,Solr 的模式就无法控制底层数据结构。
此外,更改模式的 version
属性等同于更改字段类型属性。这种类型的更改通常只在主要升级期间或由于主要升级而进行。
更改字段和字段类型属性
当您通过添加字段、删除字段或更改字段或字段类型定义来更改模式时,您通常这样做是为了让这些更改影响文档的搜索方式。在所有文档重新索引之前,这些更改的全部效果不会反映在整个语料库中。
为了使更改反映在所有文档中,必须重新索引 字段类型属性 中描述的对任何字段/字段类型属性的更改。
不建议在不重新索引的情况下更改影响索引的字段属性。只有在彻底了解后果的情况下才应尝试这样做。对用户的负面影响可能不会立即显现。 |
更改字段分析
除了特定的字段级属性之外,分析链也在字段类型上配置,并在索引和查询时应用。
如果为字段的查询和索引事件定义了单独的分析链,并且您仅更改了查询时分析链,则无需重新索引。
在几乎所有情况下,对索引时分析链的任何更改都需要重新索引。
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":"*:*" }}' https://127.0.0.1:8983/solr/my_collection/update
重要的是要验证是否已删除所有文档,因为这可以确保 Lucene 索引段也已被删除。
要验证索引中是否没有段,请查看 data/index 目录并确认它没有段文件。由于可以自定义数据目录,请参阅 使用 dataDir 参数指定索引数据的位置 部分,了解索引文件的位置。
请注意,您需要验证集群中每个节点上的每个分片和每个副本中的索引都已被删除。仅查询文档数量是不够的,因为您可能没有文档,但仍然有索引段。
清除索引后,您可以通过重新运行原始索引进程来开始重新索引。
此方法的替代方法是删除并使用更新后的模式重新创建集合,然后在可以承受在重新索引过程中集合处于脱机状态的情况下重新索引。 |
索引到另一个集合
另一种方法是索引到一个新的集合,并使用 Solr 的 集合别名 功能,将应用程序无缝地指向一个新的集合,而无需停机。
此选项仅适用于在 SolrCloud 模式下运行的 Solr 安装。
使用此方法,您将文档索引到一个使用您的更改的新集合中,并在索引和测试完成后,创建一个别名,将您的前端指向新集合。从那时起,新的查询和更新将无缝地路由到新集合。
一旦别名就位,并且您确信不再需要旧数据,则可以使用 Collections API DELETE 命令删除旧集合。
此选项的一个优点是,如果您发现我们的测试没有发现的问题,您可以切换回旧集合。当然,在删除旧集合之前,此选项可能需要更多资源。 |