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 通訊,直到叢集的所有節點都升級完成。以下是執行滾動更新的步驟
-
像往常一樣執行滾動更新,但啟動 Solr 8.0 節點時,將
-Dsolr.http1=true
作為啟動參數。使用此參數時,內部請求會使用 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) 暫停。
Solr 8 支援 HTTP/2,透過使用相同的 TCP 連接平行發送多個請求來克服此問題。
HTTP/2 的 SSL 支援
為了支援 HTTP/2 連接的 SSL,Solr 使用 ALPN。
Java 8 不包含 ALPN 的實作,因此當啟用 SSL 且正在使用 Java 8 時,Solr 將僅以 HTTP/1 啟動。
HTTP/2 的用戶端變更
Http2SolrClient
導入了基於 Jetty Client 的 HTTP/2 和非同步功能。此用戶端取代了 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
configset 中有一個新的欄位,名為_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
。
預設 Configset
-
_default
configset 現在包含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
configset(位於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 現在會為其叢集上已啟用驗證的任何使用者顯示登入畫面。具有 基本驗證 的叢集將會提示使用者輸入使用者名稱和密碼。在設定為使用 Kerberos 驗證 的叢集上,驗證會像以前一樣由瀏覽器透明地處理,但如果驗證失敗,使用者將會被指示設定其瀏覽器以提供適當的 Kerberos 票證。
登入畫面的目的僅為外觀上的呈現 - 在 7.7 版本之前及現在,管理介面 (Admin UI) 觸發的 Solr 請求都需要進行身份驗證。登入畫面僅改變了提供此身份驗證的使用者體驗。
分散式請求
-
shards
參數用於手動選擇接收分散式請求的分片和副本,現在會根據可接受值的允許清單檢查節點,以確保安全性。在 SolrCloud 模式下,此允許清單會自動設定為包含所有即時節點。
在使用者管理的叢集或單節點安裝中,允許清單預設為空。在這些安裝中使用 shards
參數的升級使用者,可以透過在其 solrconfig.xml
檔案中設定任何 shardHandler
設定中的 shardsWhitelist
屬性來設定此值。
+ 如需更多資訊,請參閱分散式請求文件。
Solr 7.6
請參閱 7.6 發行說明,以瞭解 Solr 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
請參閱 7.5 發行說明,以瞭解 Solr 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
指定為正整數。在「盡力而為」的基礎上,會遵守將maxSegments
設定高於1
的情況。TieredMergePolicy
也會比早期更積極地從超出maxMergedSegmentMB
的區段中回收資源。
UIMA 已移除
-
UIMA 模組已從 Solr 中移除,且不再可用。
記錄
-
預設情況下,Solr 的記錄設定檔現在位於
server/resources/log4j2.xml
。 -
Windows 使用者的錯誤已修正。使用 Solr 的範例 (
bin/solr start -e
) 時,記錄檔現在將放置在正確的位置 (example/
而非server
)。另請參閱Solr 範例和 Solr 控制腳本參考,以取得更多資訊。
Solr 7.4
請參閱 7.4 發行說明,以瞭解 Solr 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
檔案中。
使用者管理叢集
-
在領導者-追隨者模型的 Solr 擴展中,追隨者在複製期間於領導者上偵測到全新的索引時,不再提交空的索引。若要還原為先前的行為,請在複製處理常式設定的追隨者部分中,將
false
傳遞給skipCommitOnLeaderVersionZero
,或將其傳遞給fetchindex
命令。
如果您是從早於 Solr 7.3 的版本升級,請參閱以下先前的版本說明。
Solr 7.3
請參閱 7.3 發行說明,以瞭解 Solr 7.3 的主要新功能概述。
升級至 Solr 7.3 時,使用者應注意 v7.2 的以下主要變更
Configsets
-
自 Solr 7.0 起,未指定 configset 名稱建立的集合使用
_default
configset 的副本。在 7.3 之前,複製的 configset 與集合名稱相同,但從 7.3 開始,它將使用新的「.AUTOCREATED」後綴命名。這是為了防止覆寫自訂 configset 名稱。
學習排序
-
用於學習排序
rerank
查詢剖析的rq
參數不再考慮defType
參數。請參閱執行重新排序查詢,以瞭解更多關於此參數的資訊。
自動縮放與自動新增副本
-
自動縮放系統的行為現在會在動作開始和冷卻期結束之間暫停所有觸發器的執行。觸發器會在冷卻期過期後恢復。先前,冷卻期是在觸發器事件的動作完成後開始的固定期間,在此期間,所有觸發器會繼續執行,但任何事件都會被拒絕並稍後嘗試。
-
用於限制處理的自動縮放事件速率的節流機制已移除。這會棄用自動縮放 API 中的
actionThrottlePeriodSeconds
設定,該設定現在無法運作。請改用triggerCooldownPeriodSeconds
參數暫停事件處理。 -
與自動新增副本功能一起使用的
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 命令,以允許這些副本成為領導者。
空間
-
如果您將空間 JTS 程式庫與 Solr 一起使用,則必須升級到 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"
的暫停/恢復觸發 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
基於安全性考量而移除。如果您想要監聽因更新、提交或最佳化而發生的事件,請將您自己的監聽器撰寫為 Solr 外掛程式的一部分,作為原生 Java 類別。
XML 查詢解析器
-
在 XML 查詢解析器 (
defType=xmlparser
或{!xmlparser … }
) 中,預設情況下不允許解析外部實體。
如果您是從 Solr 7.0 之前的版本升級,請在開始升級之前參閱Solr 7 中的主要變更。