設定 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> 會將自訂的管理處理器 (MyAdminHandler) 設定為處理管理請求。

如果未設定此屬性,Solr 會使用預設的管理處理器 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>

定義自訂動作後,可以使用其名稱呼叫它們

https://127.0.0.1:8983/solr/admin/cores?action=foo
collectionsHandler

選用

預設值:org.apache.solr.handler.admin.CollectionsHandler

如上所述,適用於自訂 CollectionsHandler 實作。

infoHandler

選用

預設值:org.apache.solr.handler.admin.InfoHandler

如上所述,適用於自訂 InfoHandler 實作。

coreLoadThreads

選用

預設值:無

指定將分配多少個執行緒來平行載入核心。

replayUpdatesThreads

選用

預設值:請參閱說明

指定將分配多少個執行緒來平行重播更新。此集區由節點的所有核心共用。預設值等於處理器的數量。

indexSearcherExecutorThreads

選用

預設值:可用的處理器數量

指定將分配給搜尋查詢的執行緒數量。

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

modules

選用

預設值:無

接受一個要啟動時啟用的捆綁 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.allowUrls 系統屬性在 solr.in.sh / solr.in.cmd 中設定。如果您需要為了向後相容性而停用此功能,您可以設定系統屬性 solr.disable.allowUrls=true

hideStackTrace

選用

預設值:無

當此屬性設定為 true 時,Solr 在發生錯誤時不會在 HTTP 回應中傳回任何堆疊追蹤。預設情況下(false),堆疊追蹤僅針對可預測的 Solr 例外狀況隱藏,但對於非預期的例外狀況(即:HTTP 500),則會傳回回應中。

shareSchema

選用

預設值:無

當此屬性設定為 true 時,可確保指向相同 Schema 資源檔案的多個核心將會參照相同的 IndexSchema 物件。共用 IndexSchema 物件可以加快核心載入速度。如果您使用此功能,請確保您的 Schema 檔案中沒有使用任何核心特定的屬性。

transientCacheSize

選用

預設值:無

從 9.2 版起已棄用。定義在卸載一個不再使用、但需要的新核心之前,可以載入多少個 transient=true 的 Solr 核心。

configSetBaseDir

選用

預設值:$SOLR_HOME/configsets

可以在其中找到 Solr 核心設定集的目錄。

maxBooleanClauses

選用

預設值:請參閱說明

設定任何查詢中允許的最大(巢狀)子句數量。

此全域限制對任何集合的任何查詢中允許的子句總數提供了安全限制 - 無論這些子句是在查詢字串中明確指定,還是由於基於索引中詞語的更複雜查詢類型的查詢擴展/重寫所導致的結果。此限制在 Lucene 中的多個點強制執行,既是為了防止基本查詢物件(主要是 BooleanQuery)建構具有過多的子句,而可能耗盡 JVM 堆積,也是為了確保沒有複合查詢(由多個基本查詢組成)可以執行過多的 *總* 巢狀子句,而可能導致搜尋執行緒使用過多的 CPU。

在預設設定中,如果指定了此屬性,則會使用 solr.max.booleanClauses 系統屬性的值。這是 _default 設定集中用於 solrconfig.xml<maxBooleanClauses> 元素 的相同系統屬性,這使 Solr 管理員可以輕鬆地增加兩個值(在所有集合中),而無需搜尋和更新所有設定。

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

選用

預設值:請參閱說明

以逗號分隔的 regex 模式清單,用於比對應該編輯以隱藏敏感資訊的 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

選用

預設值:無

網址內容路徑。

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 毫秒

當嘗試為分片選出領導者時,此屬性設定複本等待看到衝突狀態資訊被解決的最長時間;當進行滾動重新啟動時,特別是當託管監察者的節點重新啟動時,可能會發生暫時的狀態資訊衝突。

通常,預設值 180000 (ms) 足以解決衝突;如果您在 SolrCloud 中有數百或數千個小型集合,則可能需要增加此值。

zkClientTimeout

選用

預設值:無

連線到 ZooKeeper 伺服器的逾時。它與 SolrCloud 一起使用。

zkHost

選用

預設值:無

在 SolrCloud 模式下,Solr 應該用於叢集狀態資訊的 ZooKeeper 主機的 URL。

genericCoreNodeNames

選用

預設值:無

如果為 true,則節點名稱不是基於節點的位址,而是基於識別核心的通用名稱。當不同的機器接管服務該核心時,會更容易理解。

zkCredentialsProviderzkACLProviderzkCredentialsInjector

選用

預設值:無

如果您使用ZooKeeper 存取控制,則可以指定的選用參數。

distributedClusterStateUpdates

選用

預設值:無

如果為 true,則 SolrCloud 的內部行為會變更為不使用監察者來更新集合的 state.json,而是直接對 ZooKeeper 執行此操作。

minStateByteLenForCompression

選用

預設值:-1

可選參數,用於啟用透過網路傳輸和儲存在 Zookeeper 中的 state.json 壓縮。提供的值是壓縮 state.json 的最小位元組長度,即,任何位元組大小高於該大小的 state.json 都將被壓縮。預設值為 -1,表示 state.json 永遠不會壓縮。

stateCompressor

選用

預設值:org.apache.solr.common.util.ZLibCompressor

可選參數,用於為透過網路傳輸和儲存在 Zookeeper 中的 state.json 提供壓縮實作。提供的值是 state 壓縮要使用的類別。僅當 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 提供的預設且唯一的分片處理常式是 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[:選項預設值]}。這允許定義一個在啟動 Solr 時可以覆蓋的預設值。如果未指定預設值,則必須在執行時指定該屬性,否則在解析時 solr.xml 檔案將會產生錯誤。

通常在使用啟動 JVM 時使用 -D 旗標指定的任何 JVM 系統屬性,都可以在 solr.xml 檔案中用作變數。

例如,在下面顯示的 solr.xml 檔案中,socketTimeoutconnTimeout 值都設定為「60000」。但是,如果您使用 bin/solr start -DsocketTimeout=1000 啟動 Solr,則 HttpShardHandlerFactorysocketTimeout 選項將使用 1000 毫秒的值覆蓋,而 connTimeout 選項將繼續使用預設屬性值「60000」。

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