Solr 8 中的主要变更
Solr 8.0 是 Solr 的一个主要新版本。
本页重点介绍最大的更改,包括您可能需要注意的新功能,以及默认行为的更改和已删除的已弃用功能。
Solr 8 升级计划
在开始升级到 Solr 8 之前,请花时间查看有关您当前使用的版本到 Solr 8 的所有更改信息。
您还应考虑在您尚未升级的任何版本中对 Solr 所做的所有更改。例如,如果您当前使用的是 Solr 7.4,则除了 8.0 的更改之外,还应查看所有后续 7.x 版本中所做的更改。
彻底查看下面的早期 7.x 版本中的主要变更中的列表,以及 Solr 实例中的 CHANGES.txt 将帮助您规划迁移到 Solr 8。
升级先决条件
如果使用 SolrCloud,则必须使用 Solr 7.3.0 或更高版本。Solr 的 LeaderInRecovery (LIR) 功能在 Solr 7.3 中发生了重大变化。虽然这些更改向后兼容所有后续的 7.x 版本,但该兼容性已在 8.0 中删除。为了升级到 Solr 8.x,集群的所有节点都必须运行 Solr 7.3 或更高版本。如果尝试使用运行早于 7.3 版本的节点进行升级,则可能会丢失文档。
如果您不在 SolrCloud 模式下使用 Solr(您运行用户管理的集群或单节点安装),我们预计您可以从任何 7.x 版本升级到 Solr 8 而不会出现重大问题。
使用 Solr 8 进行滚动升级
如果您计划使用滚动升级模型(依次升级每个节点,而不是启动一个全新的 8.x 集群)来升级集群,请仔细阅读以下内容。
Solr 节点可以监听和服务 HTTP/2 或 HTTP/1 请求。默认情况下,大多数内部请求都使用 HTTP/2 发送。但这意味着,默认情况下,Solr 8.0 节点无法与运行 Solr 8.0 之前的版本的节点通信。
但是,您可以使用参数启动 Solr 8.0 以强制 HTTP/1.1 通信,直到集群的所有节点都已升级。以下是执行滚动更新的步骤
-
像往常一样执行滚动更新,但是使用
-Dsolr.http1=true
作为启动参数启动 Solr 8.0 节点。当使用此参数时,内部请求将使用 HTTP/1.1 发送。./bin/solr start -c -Dsolr.http1=true -z localhost:2481/solr -s /path/to/solr/home
请注意,上述命令必须针对您的环境进行自定义。Solr 控制脚本参考部分包含所有可能的选项。如果您将 Solr 作为服务运行,则您可能更喜欢查看升级 Solr 集群部分。
-
当所有节点都升级到 8.0 时,请重新启动每个节点,不要使用
-Dsolr.http1
参数。
新功能和增强功能
HTTP/2 支持
从 Solr 8 开始,Solr 节点支持 HTTP/2 请求。
到目前为止,Solr 仅限于 HTTP/1.1。HTTP/1.1 实际上每个 TCP 连接只允许一个未完成的请求,这意味着要同时发送多个请求,必须建立多个 TCP 连接。这会导致双方资源浪费和长时间的垃圾回收 (GC) 暂停。
支持 HTTP/2 的 Solr 8 通过允许使用同一个 TCP 连接并行发送多个请求来克服了这个问题。
HTTP/2 的 SSL 支持
为了支持通过 HTTP/2 连接的 SSL,Solr 使用 ALPN。
Java 8 不包含 ALPN 的实现,因此当启用 SSL 并且正在使用 Java 8 时,Solr 将仅以 HTTP/1 启动。
HTTP/2 的客户端更改
引入了基于 Jetty Client 的具有 HTTP/2 和异步功能的 Http2SolrClient
。此客户端取代了 HttpSolrClient
和 ConcurrentUpdateSolrClient
,用于发送大多数内部请求(由 UpdateShardHandler
和 HttpShardHandler
发送)。
但是,这会导致配置和身份验证设置发生以下更改
-
updateShardHandler
参数maxConnections
不再使用,已被删除。 -
HttpShardHandler
参数maxConnections
参数不再使用,已被删除。 -
自定义
AuthenticationPlugin
实现必须通过实现HttpClientBuilderPlugin.setup
为Http2SolrClient
提供自己的设置,否则内部请求将无法进行身份验证。
嵌套文档
嵌套文档支持方面进行了一些改进。
Solr 现在能够将有关文档关系的信息存储在索引中。此存储的信息可用于查询。
如果关系已正确存储在索引中,则子文档转换器现在也可以以嵌套形式返回子项。
在升级到 Solr 8 的上下文中,有一些重要的更改需要重点说明
-
当使用
split
参数拆分的嵌套子文档将 JSON 数据发送到 Solr 时,子文档现在将通过 JSON 中使用的字段/标签字符串而不是匿名方式与其父文档关联。大多数用户可能不会注意到这种区别,因为除非架构中存在特殊字段,否则标签会丢失。此选择以前可以使用内部/专家
anonChildDocs
参数标志进行切换,该标志已被删除。 -
现在,通过其 uniqueKey 删除(或更新)文档的范围仅限于考虑根文档,而不是子/嵌套文档。因此,按 ID 删除将不适用于子文档(它将静默失败),并且尝试通过提供具有相同 ID 的新文档来更新子文档将添加新文档(这可能是错误的)。
这两种操作过去和现在仍然存在问题。但是,就地更新是安全的。如果要删除某些子文档,并且知道它们本身没有嵌套子项,则必须使用按查询删除技术进行删除。
-
Solr 在
_default
配置集中有一个新字段,称为_nest_path_
。此字段存储非根文档在层次结构中的路径。
配置和默认参数更改
8.0 中的架构更改
以下更改会影响字段的行为方式。
默认评分 (SimilarityFactory)
-
如果在架构中显式使用
BM25SimilarityFactory
,则绝对评分会降低,因为 Lucene 更改了 BM25 的计算方式以删除乘法因子(有关技术细节,请参阅 LUCENE-8563 或 SOLR-13025)。在正常情况下,文档的排序不会更改。如果需要强制使用旧的 6.x/7.x 评分,请使用LegacyBM25SimilarityFactory
。请注意,如果在架构中未指定任何 similarityFactory,或者使用默认的
SchemaSimilarityFactory
,则当luceneMatchVersion
的值低于8.0.0
时,会自动选择LegacyBM25Similarity
。另请参阅相似度部分以获取更多信息。
内存编解码器已删除
-
内存编解码器已从 Lucene 中删除 (
MemoryPostings
,MemoryDocValues
),并且在 Solr 中不再可用。如果在任何字段或字段类型配置上使用了postingsFormat="Memory"
或docValuesFormat="Memory"
,则删除该设置以使用默认设置,或者尝试其他选项之一。
LowerCaseTokenizer
-
LowerCaseTokenizer
已弃用,很可能在 Solr 9 中删除。建议用户改用LetterTokenizer
和LowerCaseFilter
。
默认配置集
-
_default
配置集现在包括一个ignored_*
动态字段规则。
8.0 中的索引更改
以下更改会影响文档的索引方式。
索引时提升
-
索引时提升已从 Lucene 版本 7.0 中删除,在 Solr 7.x 中,语法仍然允许(尽管它在日志中记录了警告)。语法类似于
{"id":"1", "val_s":{"value":"foo", "boost":2.0}}
此语法已完全删除,如果发送到 Solr,现在会产生错误。这是结合嵌套文档支持的改进而完成的。
ParseDateFieldUpdateProcessorFactory
-
ParseDateFieldUpdateProcessorFactory
(在“无模式模式”下默认使用)使用的日期格式模式现在由 Java 8 的java.time.DateTimeFormatter
而不是 Joda Time 解释。模式语言非常相似但不相同。通常,只需将大写“Z”更改为小写“z”即可更新模式。有关无模式模式下当前推荐的模式集,请参阅无模式模式部分,或者只需检查
_default
配置集(位于server/solr/configsets
中)。另请注意,默认的日期模式(格式)集已从以前的版本扩展,以包含以前由“提取”模块(Solr Cell / Tika)处理的那些模式。
Solr Cell
Langid 模块
-
langid 模块(位于
modules/langid
中)中的LanguageIdentifierUpdateProcessor
基类更改了一些方法签名。如果您有自定义语言标识符实现,则需要调整代码。有关更改的详细信息,请参阅 Jira 问题 SOLR-11774。
8.0 中的查询更改
以下更改会影响查询行为。
高亮显示
-
统一高亮显示器参数
hl.weightMatches
现在默认为true
。有关高亮显示器参数的更多信息,请参阅高亮显示部分。
eDisMax 查询解析器
-
当
qf
参数引用不存在的字段时,eDisMax 查询解析器现在会抛出错误。
函数查询解析器
-
函数查询解析器现在在产生负值时返回等于零 (0) 的分数。此更改的原因是 Lucene 现在要求分数必须为正数。
8.0 中的身份验证和安全更改
-
身份验证插件现在可以基于每个请求拦截节点间请求。
-
基本身份验证插件现在有一个选项
forwardCredentials
,允许在分布式搜索的情况下在节点间请求中转发基本身份验证标头,而不是回退到 PKI。 -
现在会报告身份验证请求的指标。
8.0 中的自动缩放更改
-
Solr 中使用的默认副本放置策略已恢复为 Solr 7.4 及先前版本使用的“旧”策略。这是因为 Solr 7.5 中默认的基于自动缩放的副本放置策略存在多个错误,这些错误会导致同一分片的多个副本放置在同一节点上,此外还会忽略
maxShardsPerNode
和createNodeSet
参数。尽管默认设置已更改,但如果指定了集群策略或首选项,或者正在使用集合级策略,则将继续使用自动缩放。
可以通过设置集群属性,将默认的副本放置策略改回使用自动伸缩。
curl -X POST -H 'Content-type:application/json' --data-binary ' { "set-obj-property": { "defaults" : { "cluster": { "useLegacyReplicaAssignment":false } } } }' http://$SOLR_HOST:$SOLR_PORT/api/cluster
-
现在可以通过
bin/solr autoscaling
使用一个新的命令行选项,在运行的 Solr 集群之外计算自动伸缩策略建议和诊断信息。此选项可以使用现有的自动伸缩策略,或测试来自服务器文件系统上文件的新的策略的影响。
早期 7.x 版本中的主要更改
以下是 Solr 7.1 和 7.7 之间发布的主要更改列表。
请务必查看此列表,以便了解您当前运行的 Solr 版本和 Solr 8.0 之间可能发生的变化。
Solr 7.7
有关 Solr 7.7 中主要新功能的概述,请参阅 7.7 发行说明。
升级到 Solr 7.7.x 时,用户应注意 v7.6 的以下主要更改
管理 UI
-
现在,管理 UI 会为集群上启用身份验证的任何用户显示登录屏幕。使用 基本身份验证的集群将提示用户输入用户名和密码。在配置为使用 Kerberos 身份验证的集群上,身份验证像以前一样由浏览器透明地处理,但如果身份验证失败,用户将被引导配置其浏览器以提供适当的 Kerberos 票证。
登录屏幕的目的仅在于外观 - 管理 UI 触发的 Solr 请求在 7.7 之前就已经需要进行身份验证,现在仍然如此。登录屏幕仅更改了提供此身份验证的用户体验。
分布式请求
-
用于手动选择接收分布式请求的分片和副本的
shards
参数,现在出于安全原因会根据可接受值的允许列表检查节点。在 SolrCloud 模式下,此允许列表会自动配置为包含所有活动节点。
在用户管理的集群或单节点安装中,默认情况下允许列表为空。在这些安装中使用 shards
参数的升级用户可以通过在其 solrconfig.xml
文件中的任何 shardHandler
配置中设置 shardsWhitelist
属性来设置此值。
+ 有关更多信息,请参阅 分布式请求文档。
Solr 7.6
有关 Solr 7.6 中主要新功能的概述,请参阅 7.6 发行说明。
升级到 Solr 7.6 时,用户应注意 v7.5 的以下主要更改
集合
-
使用 CLUSTERPROP 命令设置集群范围默认集群属性的 JSON 参数已更改。
旧语法将默认值嵌套到名为
clusterDefaults
的属性中。新语法仅使用defaults
。要使用的命令仍然是set-obj-property
。新语法的示例是
{ "set-obj-property": { "defaults" : { "collection": { "numShards": 2, "nrtReplicas": 1, "tlogReplicas": 1, "pullReplicas": 1 } } } }
旧语法将至少支持到 Solr 9,但建议用户尽快开始使用新语法。
-
参数
min_rf
已被弃用,不再需要提供才能查看实现的复制因子。此信息现在始终会随着响应返回给客户端。
自动伸缩
-
现在,自动伸缩策略用作选择在其上创建新副本或新集合的副本的节点的默认策略。
现在所有用户都有一个默认策略,该策略将按核心数和可用空闲磁盘对节点进行排序,这意味着默认情况下,将选择已经具有最少核心数且具有最高可用空闲磁盘的节点来创建新核心。
-
上述更改对
maxShardsPerNode
参数有两个额外的影响-
它取消了当自动伸缩策略到位时使用
maxShardsPerNode
的限制。现在,创建集合时始终可以设置此参数。 -
当自动伸缩策略到位时,它会删除
maxShardsPerNode=1
的默认设置。无论自动伸缩策略是否到位,它都将正确设置(如果需要)。maxShardsPerNode
的默认值仍然是1
。如果需要旧的无限制maxShardsPerNode
行为,则可以将其设置为-1
。
-
DirectoryFactory
-
Lucene 引入了
ByteBuffersDirectoryFactory
来替代RAMDirectoryFactory
,后者将在 Solr 9 中删除。虽然仍然鼓励大多数用户使用
NRTCachingDirectoryFactory
,它允许 Lucene 选择要使用的最佳目录工厂,但如果您已显式配置 Solr 使用RAMDirectoryFactory
,则建议您在 Solr 9 发布之前尽快切换到新实现。有关新目录工厂的更多信息,请参阅 Jira 问题 LUCENE-8438。
有关 Solr 中目录工厂配置的更多信息,请参阅 索引位置和格式部分。
Solr 7.5
有关 Solr 7.5 中主要新功能的概述,请参阅 7.5 发行说明。
升级到 Solr 7.5 时,用户应注意 v7.4 的以下主要更改
架构更改
-
自 Solr 7.0 以来,Solr 的架构字段猜测已为所有
_txt
字段创建_str
字段,并在查询中默认返回这些字段。从 7.5 开始,默认情况下将不再返回_str
字段。它们仍然可用,并且可以使用查询中的fl
参数请求。另请参阅有关 字段猜测的部分,了解有关架构字段猜测如何工作的更多信息。 -
自 Solr v4 以来至少一直无法运行的标准筛选器已被删除。
索引合并策略
-
当使用
TieredMergePolicy
(Solr 的默认合并策略)时,optimize
和expungeDeletes
现在会遵守maxMergedSegmentMB
配置参数,该参数默认为5000
(5GB)。如果绝对有必要控制优化后存在的段数,请将
maxSegments
指定为正整数。在“尽力而为”的基础上遵守大于1
的maxSegments
设置。TieredMergePolicy
还会比以前更积极地从超过maxMergedSegmentMB
的段中回收资源。
UIMA 已删除
-
UIMA 模块已从 Solr 中删除,不再可用。
日志记录
-
Solr 的日志记录配置文件现在默认位于
server/resources/log4j2.xml
中。 -
已修复 Windows 用户的错误。当使用 Solr 的示例(
bin/solr start -e
)时,日志文件现在将放置在正确的位置(example/
而不是server
)。另请参阅 Solr 示例和 Solr 控制脚本参考了解更多信息。
Solr 7.4
有关 Solr 7.4 中主要新功能的概述,请参阅 7.4 发行说明。
升级到 Solr 7.4 时,用户应注意 v7.3 的以下主要更改
日志记录
-
Solr 现在使用 Log4j v2.11。Log4j 配置现在在
log4j2.xml
中,而不是log4j.properties
文件中。这仅是服务器端更改,使用 SolrJ 的客户端不需要任何更改。客户端仍然可以使用与 SLF4J 兼容的任何日志记录实现。我们现在让 Log4j 处理启动时 Solr 日志的轮换,并且bin/solr
启动脚本将不再尝试此操作,也不会将现有的控制台或垃圾收集日志移动到logs/archived
中。有关 Solr 日志记录的更多详细信息,请参阅 配置日志记录。 -
配置
slowQueryThresholdMillis
现在会将慢速请求记录到名为solr_slow_requests.log
的单独文件中。以前它们会记录在solr.log
文件中。
用户管理的集群
-
在 领导者-跟随者模型中,当在复制期间在领导者上检测到全新的索引时,跟随者不再提交空索引。要返回到之前的行为,请在复制处理程序配置的跟随者部分中将
false
传递给skipCommitOnLeaderVersionZero
,或将其传递给fetchindex
命令。
如果您是从早于 Solr 7.3 的版本升级,请参阅下面的先前版本说明。
Solr 7.3
有关 Solr 7.3 中主要新功能的概述,请参阅 7.3 发行说明。
升级到 Solr 7.3 时,用户应注意 v7.2 的以下主要更改
Configsets
-
自 Solr 7.0 以来,创建时未指定 configset 名称的集合使用了
_default
configset 的副本。在 7.3 之前,复制的 configset 与集合名称相同,但从 7.3 开始,它将使用新的 “.AUTOCREATED” 后缀命名。这是为了防止覆盖自定义 configset 名称。
学习排序
-
与学习排序
rerank
查询解析一起使用的rq
参数不再考虑defType
参数。有关此参数的更多信息,请参阅 运行重新排序查询。
自动伸缩和 AutoAddReplicas
-
自动伸缩系统的行为现在将暂停从操作开始到冷却期结束之间的所有触发器执行。触发器将在冷却期到期后恢复。以前,冷却期是在触发事件的操作完成后开始的固定时期,在此期间所有触发器继续运行,但任何事件都被拒绝并在以后尝试。
-
用于限制处理自动伸缩事件速率的限制机制已删除。这弃用了自动伸缩 API 中的
actionThrottlePeriodSeconds
设置,该设置现在不可操作。请改用triggerCooldownPeriodSeconds
参数来暂停事件处理。 -
与 AutoAddReplicas 功能一起使用的
autoReplicaFailoverWaitAfterExpiration
的默认值已从之前的默认值 30 秒增加到 120 秒。这会影响 Solr 添加新副本以替换崩溃或关闭的节点上的副本的速度。
日志记录
-
默认的 Solr 日志文件大小和备份数量已分别提高到 32MB 和 10。有关如何配置日志记录的更多信息,请参阅 配置日志记录 部分。
SolrCloud
-
旧的恢复中领导者实现(在 Solr 4.9 中实现)现在已被弃用并替换。Solr 将支持从旧的 7.x 版本 Solr 到未来的 7.x 版本的滚动升级,直到 7.x 主要版本的最后一个版本。
这意味着要将来升级到 Solr 8,您需要使用 Solr 7.3 或更高版本。
-
不再允许过时的副本成为领导者。使用集合 API 的 FORCELEADER 命令来允许这些副本成为领导者。
空间
-
如果您正在使用带有 Solr 的空间 JTS 库,则必须升级到 1.15.0。这个新版本的 JTS 现在已获得双重许可,包括 BSD 样式许可。有关更多信息,请参阅 空间搜索 部分。
高亮显示
-
solrconfig.xml
中的顶层<highlighting>
元素现在正式弃用,建议使用等效的<searchComponent>
语法。此元素在默认 Solr 安装中已不再使用多个版本。
如果您是从早于 Solr 7.2 的版本升级,请参阅下面的先前版本说明。
Solr 7.2
请参阅 7.2 发行说明,了解 Solr 7.2 中的主要新功能概述。
升级到 Solr 7.2 时,用户应注意 v7.1 中的以下主要更改
本地参数
-
以 本地参数
{!myparser …}
开头的查询字符串用于从一个查询解析器切换到另一个解析器,并且旨在供 Solr 系统开发人员使用,而不是最终用户进行搜索。为了减少意外黑客攻击的负面影响,Solr 现在限制了本地参数将被解析的情况,仅限于默认解析器为lucene
或func
的上下文。因此,如果
defType=edismax
,则q={!myparser …}
将不起作用。在该示例中,将所需的查询解析器放入defType
参数中。另一个例子是,如果
deftype=edismax
,则hl.q={!myparser …}
也不会因相同原因而起作用。在此示例中,请将所需的查询解析器放入hl.qparser
参数中,或设置hl.qparser=lucene
。大多数用户不会遇到这些情况,但某些用户需要进行更改。如果您必须具有完全的向后兼容性,请使用
luceneMatchVersion=7.1.0
或更早的版本。
eDisMax 查询解析器
-
默认情况下,eDisMax 解析器不再允许使用本地参数或旧的
_query_
魔术字段技巧指定 Solr 解析器的子查询。例如,
{!prefix f=myfield v=enterp}
或_query_:"{!prefix f=myfield v=enterp}"
默认情况下不再支持。如果您希望允许高级用户执行此操作,请设置uf=* _query_
或包含_query_
的其他值。如果您暂时需要完全的向后兼容性,请使用
luceneMatchVersion=7.1.0
或更早的版本。
如果您是从早于 Solr 7.1 的版本升级,请参阅下面的先前版本说明。
Solr 7.1
请参阅 7.1 发行说明,了解 Solr 7.1 的主要新功能概述。
升级到 Solr 7.1 时,用户应注意 v7.0 中的以下主要更改
AutoAddReplicas
-
如果副本宕机,自动添加副本的功能(以前仅在 HDFS 中存储索引时可用)已移植到自动缩放框架。因此,即使索引位于本地磁盘上,所有用户现在都可以使用
autoAddReplicas
。此功能的现有用户应该不必更改任何内容。但是,他们应注意以下更改
-
行为:使用 MODIFYCOLLECTION API 将
autoAddReplicas
属性从禁用 (false
) 更改为启用 (true
) 不再立即替换集合的宕机副本。相反,仅当包含它们的节点在启用autoAddReplicas
时宕机,才会添加副本。不再使用参数autoReplicaFailoverBadNodeExpiration
和autoReplicaFailoverWorkLoopDelay
。 -
弃用:使用 API 在集群范围内启用/禁用 autoAddReplicas 将被弃用;请改用具有
name=".auto_add_replicas"
的 suspend/resume 触发器 API。
-
指标报告器
-
分片和集群指标报告器配置现在需要
class
属性。-
如果报告器配置了
group="shard"
属性,请同时配置class="org.apache.solr.metrics.reporters.solr.SolrShardReporter"
属性。 -
如果报告器配置了
group="cluster"
属性,请同时配置class="org.apache.solr.metrics.reporters.solr.SolrClusterReporter"
属性。有关更多信息,请参阅指标报告:分片和集群报告器部分。
-
流式表达式
-
solrj.io.eval
中的所有流评估器都已重构,以具有更简单、更健壮的结构。这简化并压缩了实现新评估器所需的代码,并使评估器更容易处理不同的数据类型(基元、对象、数组、列表等)。
ReplicationHandler
-
在 ReplicationHandler 中,
leader.commitReserveDuration
子元素已被弃用。请改为配置直接的commitReserveDuration
元素以在所有模式(主节点、从节点、云)中使用。
RunExecutableListener
-
出于安全原因,
RunExecutableListener
已被删除。如果您想监听由更新、提交或优化引起的事件,请将您自己的监听器作为本机 Java 类编写为 Solr 插件的一部分。
XML 查询解析器
-
在 XML 查询解析器(
defType=xmlparser
或{!xmlparser … }
)中,默认情况下现在不允许解析外部实体。
如果您是从早于 Solr 7.0 的版本升级,请在开始升级之前参阅Solr 7 中的主要更改。