配置 solr.xml

solr.xml 文件定义了一些全局配置选项,这些选项适用于所有或许多核心。

本部分将介绍 Solr 中包含的默认 solr.xml 文件,以及如何根据需要对其进行修改。有关如何配置 core.properties 的详细信息,请参阅部分 核心发现

定义 solr.xml

可以在 $SOLR_HOME 目录(通常为 server/solr/var/solr/data)中找到 solr.xml,或者在使用 SolrCloud 时也可以在 ZooKeeper 中找到。如果未找到 $SOLR_HOME/solr.xml,Solr 将使用默认的 solr.xml 文件。

从 Zookeeper 加载 solr.xml 已弃用,并且在未来版本中将不受支持。作为 Solr 的节点配置,此文件必须在早期启动时可用,并且还允许在节点之间有所不同。

默认的 solr.xml 文件位于 $SOLR_TIP/server/solr/solr.xml 中,如下所示

<solr>

  <int name="maxBooleanClauses">${solr.max.booleanClauses:1024}</int>
  <str name="sharedLib">${solr.sharedLib:}</str>
  <str name="modules">${solr.modules:}</str>
  <str name="allowPaths">${solr.allowPaths:}</str>
  <str name="allowUrls">${solr.allowUrls:}</str>
  <str name="hideStackTrace">${solr.hideStackTrace:false}</str>

  <solrcloud>

    <str name="host">${host:}</str>
    <int name="hostPort">${solr.port.advertise:0}</int>
    <str name="hostContext">${hostContext:solr}</str>

    <bool name="genericCoreNodeNames">${genericCoreNodeNames:true}</bool>

    <int name="zkClientTimeout">${zkClientTimeout:30000}</int>
    <int name="distribUpdateSoTimeout">${distribUpdateSoTimeout:600000}</int>
    <int name="distribUpdateConnTimeout">${distribUpdateConnTimeout:60000}</int>
    <str name="zkCredentialsProvider">${zkCredentialsProvider:org.apache.solr.common.cloud.DefaultZkCredentialsProvider}</str>
    <str name="zkACLProvider">${zkACLProvider:org.apache.solr.common.cloud.DefaultZkACLProvider}</str>
    <str name="zkCredentialsInjector">${zkCredentialsInjector:org.apache.solr.common.cloud.DefaultZkCredentialsInjector}</str>
    <bool name="distributedClusterStateUpdates">${distributedClusterStateUpdates:false}</bool>
    <bool name="distributedCollectionConfigSetExecution">${distributedCollectionConfigSetExecution:false}</bool>
    <int name="minStateByteLenForCompression">${minStateByteLenForCompression:-1}</int>
    <str name="stateCompressor">${stateCompressor:org.apache.solr.common.util.ZLibCompressor}</str>

  </solrcloud>

  <shardHandlerFactory name="shardHandlerFactory"
    class="HttpShardHandlerFactory">
    <int name="socketTimeout">${socketTimeout:600000}</int>
    <int name="connTimeout">${connTimeout:60000}</int>
  </shardHandlerFactory>

  <metrics enabled="${metricsEnabled:true}">
    <!--reporter name="jmx_metrics" group="core" class="org.apache.solr.metrics.reporters.SolrJmxReporter"/-->
  </metrics>

</solr>

如你所见,发现 Solr 配置是“SolrCloud 友好的”。但是,<solrcloud> 元素的存在并不意味着 Solr 实例正在以 SolrCloud 模式运行。除非在启动时指定了 -DzkHost-DzkRun,否则将忽略此部分。

Solr.xml 参数

<solr> 元素

<solr> 标记中没有可以指定的属性,它是 solr.xml 的根元素。下表列出了 solr.xml 中每个 XML 元素的子节点。

configSetService

可选

默认值:configSetService

不需要设置此属性。

如果使用,此属性应设置为继承自 ConfigSetService 的类的 FQN(完全限定名称),并且必须提供一个带有类型为 org.apache.solr.core.CoreContainer 的参数的构造函数。例如,<str name="configSetService">com.myorg.CustomConfigSetService</str>

如果未设置此属性,Solr 将使用默认的 configSetService,其中 zookeeper 了解 org.apache.solr.cloud.ZkConfigSetService,而 zookeeper 不了解 org.apache.solr.core.FileSystemConfigSetService

adminHandler

可选

默认值:org.apache.solr.handler.admin.CoreAdminHandler

不需要设置此属性。

如果使用,此属性应设置为继承自 CoreAdminHandler 的类的 FQN(完全限定名称)。例如,<str name="adminHandler">com.myorg.MyAdminHandler</str> 将配置自定义的 admin 处理程序 (MyAdminHandler) 来处理 admin 请求。

如果未设置此属性,Solr 将使用默认的 admin 处理程序 org.apache.solr.handler.admin.CoreAdminHandler

coreAdminHandlerActions

可选

默认值:无

不需要设置此属性。

如果已定义,它应包含要在 CoreAdminHandler 中注册的自定义操作列表。列表的每个条目都应为 str 类型,其中条目的名称定义操作的名称,而值是继承自 CoreAdminOp 的操作类的 FQN(完全限定名称)。

例如,可以这样定义操作

  <coreAdminHandlerActions>
    <str name="foo">com.example.FooAction</str>
    <str name="bar">com.example.BarAction</str>
  </coreAdminHandlerActions>

定义自定义操作后,可以使用其名称调用它们

http://localhost:8983/solr/admin/cores?action=foo
collectionsHandler

可选

默认值:org.apache.solr.handler.admin.CollectionsHandler

如上所述,适用于自定义 CollectionsHandler 实现。

infoHandler

可选

默认值:org.apache.solr.handler.admin.InfoHandler

如上所述,适用于自定义 InfoHandler 实现。

coreLoadThreads

可选

默认值:无

指定将分配给并行加载内核的线程数。

replayUpdatesThreads

可选

默认值:请参见说明

指定将分配给并行重放更新的线程数。此池由节点的所有内核共享。默认值等于处理器数量。

coreRootDirectory

可选

默认值:server/solr

内核发现树的根,默认为 $SOLR_HOME

coresLocator

可选

默认值:org.apache.solr.core.CorePropertiesLocator

不需要设置此属性。

如果使用,此属性应设置为实现 CoresLocator 的类的 FQN(完全限定名称),并且您必须提供一个构造函数,该构造函数带有一个 org.apache.solr.core.NodeConfig 类型的参数。例如,<str name="coresLocator">com.myorg.CustomCoresLocator</str> 将配置自定义内核定位器。

coreSorter

可选

默认值:org.apache.solr.core.CoreSorter

不需要设置此属性。

如果使用,此属性应设置为实现 CoreSorter 的类的 FQN(完全限定名称),并且您必须提供一个构造函数,该构造函数带有一个 org.apache.solr.core.CoreContainer 类型的参数。当 Solr 启动时,此服务用于优先考虑应首先加载哪些内核。例如,<str name="coresLocator">com.myorg.CustomCoresLocator</str> 将配置自定义内核排序器。

managementPath

可选

默认值:无

当前不可操作。

sharedLib

可选

默认值:无

指定将跨所有内核共享的公共库目录的路径。此目录中的任何 JAR 文件都将添加到 Solr 插件的搜索路径中。如果指定的路径不是绝对路径,它将相对于 $SOLR_HOME。自定义处理程序可以放置在此目录中。请注意,指定 sharedLib 不会从 Solr 的类路径中删除 $SOLR_HOME/lib

模块

可选

默认值:无

获取要启动时启用的已捆绑 Solr 模块 列表。这种添加模块的方式会将它们添加到共享类加载器中,使它们可用于 Solr 中的每个集合,这与 solrconfig.xml 中仅针对该集合的 <lib> 标记不同。示例值:extracting,ltr。有关更多详细信息,请参阅 Solr 模块 章节。

allowPaths

可选

默认值:无

Solr 通常只访问相对于 $SOLR_HOME$SOLR_DATA_HOMEcoreRootDir 的文件夹。如果您需要(例如)在这些路径之外创建内核,您可以使用 allowPaths 明确允许该路径。它是一个逗号分隔的允许文件系统路径的字符串。特殊值 * 将允许系统上的任何路径。

allowUrls

可选

默认值:请参见说明

允许的 Solr 主机的逗号分隔列表。

可以省略 HTTP/HTTPS 协议,并且只检查主机和端口,即 10.0.0.1:8983/solr,10.0.0.1:8984/solr

当以用户管理集群的方式运行 Solr 并使用 shards 参数时,需要将主机列表明确配置为允许,否则 Solr 将禁止该请求。

在 SolrCloud 模式中,允许列表会自动配置为包括集群中的所有活动节点。

允许列表也可以使用 solr.in.sh / solr.in.cmd 中的 solr.allowUrls 系统属性进行配置。如果您需要出于向后兼容性的目的禁用此功能,您可以设置系统属性 solr.disable.allowUrls=true

hideStackTrace

可选

默认值:无

当此属性设置为 true 时,在出现错误的情况下,Solr 不会在 HTTP 响应中返回任何堆栈跟踪。默认情况下(false),堆栈跟踪仅对可预测的 Solr 异常隐藏,但会在响应中返回意外异常(即:HTTP 500)

shareSchema

可选

默认值:无

当此属性设置为 true 时,确保指向同一架构资源文件的多个内核将引用同一 IndexSchema 对象。共享 IndexSchema 对象可以加快内核加载速度。如果您使用此功能,请确保在架构文件中未使用任何内核特定属性。

transientCacheSize

可选

默认值:无

9.2 起已弃用。定义在卸载一个未使用的内核以供需要的内核使用之前,可以加载多少个 transient=true 的 Solr 内核。

configSetBaseDir

可选

默认值:$SOLR_HOME/configsets

可以在其下找到 Solr 内核的配置集的目录。

maxBooleanClauses

可选

默认值:请参见说明

设置任何查询中允许的最大(嵌套)子句数。

此全局限制对针对任何集合的任何查询中允许的子句总数提供了一个安全约束——无论这些子句是在查询字符串中明确指定的,还是基于索引中的术语从更复杂的查询类型进行查询扩展/重写的结果。此限制在 Lucene 的多个点强制执行,既可以防止以可能耗尽 JVM 堆的方式使用过多的子句构造原始查询对象(主要是 BooleanQuery),还可以确保没有复合查询(由多个原始查询组成)可以执行过多的嵌套子句,从而可能导致搜索线程使用过多的 CPU。

在默认配置中,此属性使用 solr.max.booleanClauses 系统属性的值(如果已指定)。这是 _default 配置集中用于 solrconfig.xml<maxBooleanClauses> 元素的同一系统属性,使 Solr 管理员可以轻松地增加两个值(在所有集合中),而无需搜索和更新所有配置。

<maxBooleanClauses>${solr.max.booleanClauses:1024}</maxBooleanClauses>
hiddenSysProps

可选

默认值:请参见说明

应编辑以隐藏敏感信息的 sysProps 的正则表达式模式的逗号分隔列表。

允许列表还可以使用 solr.hiddenSysProps 系统属性或通过 SOLR_HIDDEN_SYS_PROPS 环境变量进行配置。

默认情况下,Solr 将隐藏所有 basicAuth、AWS、ZK 或 SSL 机密 sysProps。它还将隐藏其中包含“password”或“secret”的任何 sysProp。

<solrcloud> 元素

此元素定义了与 SolrCloud 相关的几个参数。除非 Solr 实例使用 -DzkRun-DzkHost 启动,否则将忽略此部分

distribUpdateConnTimeout

可选

默认值:无

用于设置群集内更新的底层 connTimeout

distribUpdateSoTimeout

可选

默认值:无

用于设置群集内更新的底层 socketTimeout

host

可选

默认值:无

Solr 用于访问核心的主机名。

hostContext

可选

默认值:无

URL 上下文路径。

hostPort

可选

默认值:${solr.port.advertise:0}

Solr 用于访问核心并通过 liveNodes 公布 Solr 节点位置的端口。此选项仅在 Solr 实例监听的端口与其希望其他节点与其联系的端口不同时才需要。例如,如果 Solr 节点在代理后面运行,或者在允许端口映射的云环境(如 Kubernetes)中运行。hostPort 是 Solr 实例希望其他节点与其联系的端口。

在默认的 solr.xml 文件中,此项设置为 ${solr.port.advertise:0}。如果未通过 solr.xml 传递端口(即 0),则 Solr 将默认使用 jetty 监听的端口,由 ${jetty.port} 定义。

leaderVoteWait

可选

默认值:无

当 SolrCloud 启动时,每个 Solr 节点将等待多长时间才能找到该分片的已知副本,然后假定任何尚未报告的节点已关闭。

leaderConflictResolveWait

可选

默认值:180000 毫秒

在尝试为分片选取领导者时,此属性设置副本等待冲突状态信息得到解决的最长时间;在进行滚动重启时,尤其是在托管 Overseer 的节点重启时,状态信息中可能会出现临时冲突。

通常,默认值 180000(毫秒)足以解决冲突;如果 SolrCloud 中有数百或数千个小型集合,则可能需要增加此值。

zkClientTimeout

可选

默认值:无

连接到 ZooKeeper 服务器的超时时间。它与 SolrCloud 一起使用。

zkHost

可选

默认值:无

在 SolrCloud 模式下,Solr 应为群集状态信息使用的 ZooKeeper 主机的 URL。

genericCoreNodeNames

可选

默认值:无

如果为 true,节点名称不基于节点的地址,而是基于标识核心的通用名称。当不同的计算机接管为该核心提供服务时,理解起来会容易得多。

zkCredentialsProviderzkACLProviderzkCredentialsInjector

可选

默认值:无

如果您使用的是 ZooKeeper 访问控制,则可以指定可选参数。

distributedClusterStateUpdates

可选

默认值:无

如果为 true,SolrCloud 的内部行为将更改为不使用 Overseer 进行集合的 state.json 更新,而是直接针对 ZooKeeper 进行更新。

minStateByteLenForCompression

可选

默认值:-1

可选参数,用于启用通过网络压缩 state.json 并存储在 Zookeeper 中。提供的值是压缩 state.json 的最小字节长度,即任何大于该字节大小的 state.json 都将被压缩。默认值为 -1,表示 state.json 始终未压缩。

stateCompressor

可选

默认值:org.apache.solr.common.util.ZLibCompressor

可选参数,用于为通过网络压缩 state.json 并存储在 Zookeeper 中提供压缩实现。提供的值是用于状态压缩的类。仅当 minStateByteLenForCompression 设置为大于 -1 的值时才使用此值。

<logging> 元素

class

可选

默认值:无

用于记录的类。相应的 JAR 文件必须可供 Solr 使用,可能通过 solrconfig.xml 中的 <lib> 指令使用。

enabled

可选

默认值:true

是否启用记录。

<logging><watcher> 元素

size

可选

默认值:50

缓冲的日志事件数。

threshold

可选

默认值:无

高于此记录级别的记录将由您的特定记录实现记录。例如,在使用 Log4j 时,可以指定 DEBUG、WARN、INFO 等。

<shardHandlerFactory> 元素

如果您希望创建自定义分片处理程序,可以在 solr.xml 中定义自定义分片处理程序。

<shardHandlerFactory name="ShardHandlerFactory" class="qualified.class.name">

由于这是一个自定义分片处理程序,因此子元素特定于实现。Solr 提供的默认且唯一的 shard 处理程序是 HttpShardHandlerFactory,在这种情况下,可以指定以下子元素

socketTimeout

可选

默认值:请参见说明

群集内查询和管理请求的读取超时。默认值与 <solrcloud> 部分中指定的 distribUpdateSoTimeout 相同。

connTimeout

可选

默认值:请参见说明

群集内查询和管理请求的连接超时。默认为 <solrcloud> 部分中指定的 distribUpdateConnTimeout

urlScheme

可选

默认值:无

分布式搜索中要使用的 URL 方案。

maxConnectionsPerHost

可选

默认值:100000

允许每个主机进行的最大连接数。

corePoolSize

可选

默认值:0

为请求提供服务的线程池的初始核心大小。

maximumPoolSize

可选

默认值:无

为请求提供服务的线程池的最大大小。默认值无限制。

maxThreadIdleTime

可选

默认值:5

空闲线程在队列中保留的时间(以秒为单位),然后被终止。

sizeOfQueue

可选

默认值:无

如果线程池使用后备队列,则其最大大小可用于直接交接。默认值是使用 SynchronousQueue。

fairnessPolicy

可选

默认值:false

一个布尔值,用于配置线程池是否优先考虑公平性而不是吞吐量。

replicaRouting

可选

默认值:请参见说明

指定副本路由首选项配置的 NamedList。这可用于选择和配置副本路由首选项。default=true 可用于设置默认的基本副本路由首选项。仅尊重正面的默认状态断言;即,default=false 无效。如果未配置显式默认基本副本路由首选项,则隐式默认值为 random

<shardHandlerFactory class="HttpShardHandlerFactory">
  <lst name="replicaRouting">
    <lst name="stable">
      <bool name="default">true</bool>
      <str name="dividend">routingDividend</str>
      <str name="hash">q</str>
    </lst>
  </lst>
</shardHandlerFactory>

还可以通过 shards.preference 请求参数为每个请求指定副本路由(覆盖默认值)。如果请求同时包含 dividendhash,则 dividend 优先进行路由。要配置 stable 路由,hash 参数隐式默认为主查询参数(即 q)的字符串值的哈希。

+ 必须显式配置 dividend 参数;没有隐式默认值。如果仅需要 dividend 路由,则可以将 hash 显式设置为一个空字符串,从而完全禁用基于哈希的隐式路由。

<replicaPlacementFactory> 元素

可以在 solr.xml 中定义一个默认的 副本放置插件。要允许这样做,必须将 solr.cluster.plugin.edit.enabled 系统属性设置为 false。此设置将禁用 /cluster/plugins 编辑 API,从而防止在运行时修改集群插件。

<replicaPlacementFactory class="org.apache.solr.cluster.placement.plugins.AffinityPlacementFactory">
  <int name="minimalFreeDiskGB">10</int>
  <int name="prioritizedFreeDiskGB">200</int>
</replicaPlacementFactory>

class 属性应设置为扩展 PlacementPluginFactory 的类的 FQN(完全限定名称)。子元素特定于实现。

<clusterSingleton> 元素

solr.xml 中可以声明一个或多个 clusterSingleton 元素。要允许这样做,必须将 solr.cluster.plugin.edit.enabled 系统属性设置为 false。此设置将禁用 /cluster/plugins 编辑 API,从而防止在运行时修改群集插件。

每个 clusterSingleton 元素指定一个群集插件,该插件应在 Solr 启动时加载,以及其关联的配置。

<clusterSingleton name="pluginName" class="qualified.plugin.class">
  <int name="value1">20</int>
</clusterSingleton>

name 属性是必需的,并且对于每个 clusterSingleton 必须是唯一的。

class 属性应设置为扩展 ClusterSingleton 的类的 FQN(完全限定名称)。子元素特定于实现,此处提供 value1 作为示例。

<metrics> 元素

solr.xml 中的 <metrics> 元素允许您自定义 Solr 报告的指标。您可以定义不应返回的系统属性,或定义自定义提供程序和报告程序。

如果您想自定义安装的指标,请参阅 指标配置 部分。

<caches> 元素

solr.xml 中的 <caches> 元素支持定义和配置命名的节点级缓存。

这些缓存类似于 solrconfig.xml 中的用户定义缓存,但每个命名的缓存都作为节点级的一个长期存在的单例存在。可以通过 CoreContainer.getCache(String cacheName) 从应用程序代码访问这些节点级缓存。

请注意,由于节点级缓存存在于单个核心的上下文之上,因此连接到核心/搜索器的生命周期的配置参数(例如 autowarmCountregenerator)与节点级缓存无关/被忽略。

<solr>
  <caches>
    <cache name="myNodeLevelUserCache"
           class="solr.CaffeineCache"
           size="4096"
           initialSize="1024" />
  </caches>
</solr>

在 solr.xml 中替换 JVM 系统属性

Solr 支持在 solr.xml 中替换 JVM 系统属性值的变量,这允许在运行时指定各种配置选项。语法是 ${propertyname[:option default value]}。这允许定义可以在启动 Solr 时覆盖的默认值。如果未指定默认值,则必须在运行时指定该属性,否则在解析时 solr.xml 文件将生成错误。

通常在启动 JVM 时使用 -D 标志指定的任何 JVM 系统属性都可以用作 solr.xml 文件中的变量。

例如,在下面显示的 solr.xml 文件中,socketTimeoutconnTimeout 值都设置为“60000”。但是,如果您使用 bin/solr -DsocketTimeout=1000 启动 Solr,则 HttpShardHandlerFactorysocketTimeout 选项将被覆盖,使用 1000ms 的值,而 connTimeout 选项将继续使用“60000”的默认属性值。

<solr>
  <shardHandlerFactory name="shardHandlerFactory"
                       class="HttpShardHandlerFactory">
    <int name="socketTimeout">${socketTimeout:60000}</int>
    <int name="connTimeout">${connTimeout:60000}</int>
  </shardHandlerFactory>
</solr>