重新索引

Solr 設定的幾種類型變更需要您重新索引資料,特別是對 schema 的變更。

這些變更包括編輯欄位或欄位類型的屬性;新增欄位或複製欄位規則;升級 Solr;以及變更某些系統設定屬性。

重要的是,要意識到未重新索引可能會對 Solr 或使用者尋找他們要找的內容造成明顯和細微的後果。

此處的「重新索引」表示首先刪除現有索引,並重複您用於從記錄系統擷取整個語料庫的程序。 強烈建議 Solr 使用者具備一致且可重複的索引程序,以便在需要時可以重新建立索引。

重新擷取語料庫中的所有文件,而沒有先確保所有文件和 Lucene 段都已刪除是足夠的,請參閱 重新索引策略 一節。

建議在主要升級期間重新索引,因此除了涵蓋哪些類型的組態變更應觸發重新索引之外,本節還將涵蓋重新索引的策略。

需要重新索引的變更

Schema 變更

除了極少數例外,對集合的 schema 進行變更都需要重新索引。這是因為許多可用的選項僅在索引程序期間套用。Solr 無法在不重新索引資料的情況下實作所需的變更。

若要了解為什麼總是需要重新索引的一般原因,了解 Solr 的 schema 與底層 Lucene 索引之間的關係會很有幫助。Lucene 不使用 schema,schema 僅是 Solr 的概念。當您變更 Solr 的 schema 時,Lucene 索引不會以任何方式修改。

這表示有許多類型的 schema 變更無法單純透過修改 Solr 的 schema 來反映在索引中。這與大多數使用 schema 的資料庫模型不同。在建立索引時,Solr 的 schema 就像一本索引文件的規則手冊,告訴 Lucene 如何解釋傳送的資料。一旦文件進入 Lucene,Solr 的 schema 就無法控制底層的資料結構。

此外,變更 schema 的 version 屬性等同於變更欄位類型屬性。這種變更通常只會在主要升級期間或因為主要升級而進行。

變更欄位和欄位類型屬性

當您透過新增欄位、移除欄位或變更欄位或欄位類型定義來變更 schema 時,您通常是為了讓這些變更影響文件的搜尋方式。這些變更的完整效果必須等到所有文件重新建立索引後才會反映在整個語料庫中。

若要讓變更反映在所有文件中,必須重新建立索引,才能讓 欄位類型屬性 中描述的任何欄位/欄位類型屬性的變更生效。

不建議在不重新建立索引的情況下變更會影響索引的欄位屬性。只有在徹底了解後果的情況下,才應該嘗試這樣做。對使用者的負面影響可能不會立即顯現。

變更欄位分析

除了特定的欄位層級屬性之外,分析鏈也會在欄位類型上進行設定,並在索引和查詢時套用。

如果為欄位的查詢和索引事件定義了個別的分析鏈,而且您變更了查詢時的分析鏈,則不需要重新建立索引。

幾乎在所有情況下,任何對索引時分析鏈的變更都需要重新建立索引。

Solrconfig 變更

要找出 solrconfig.xml 中哪些變更會改變資料的擷取方式,因而需要重新建立索引,比較不直接。一般規則是「任何會改變索引儲存內容的變更都需要重新建立索引」。以下是一些已知的範例。

solrconfig.xml 中的參數 luceneMatchVersion 控制 Solr 與 Lucene 的相容性。由於此參數可能會在幕後變更分析規則,因此建議在變更時一律重新建立索引。通常只會在進行主要升級時才會變更此參數。

如果您變更 Solr 的 更新請求處理器,通常是因為您想要變更更新請求 (文件) 的處理 (索引) 方式。在這種情況下,我們建議您重新建立文件的索引,以實作您所做的變更,就像您變更了 schema 一樣。

同樣地,如果您變更 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 版本)時,沒有變更您的 schema,則通常可以略過重新建立文件的索引。但是,在升級到主要版本時,您應該規劃重新建立文件的索引。
當您升級以較 X-1 舊的 Solr 版本產生的索引時,您必須一律重新建立語料庫的索引。例如,如果您要升級到 Solr 8x,則必須刪除曾經由 Solr 6x 使用過的索引,並依照以下概述的方式重新擷取。會寫入一個標記,以識別用於擷取第一個文件的 Lucene 版本。除非完全刪除索引,否則該標記會永久保留在索引中。如果 Lucene 發現標記比 X-1 個主要版本舊,則會拒絕開啟索引。

重新建立索引策略

有幾種方法可用於執行重新建立索引。

以下描述的策略可確保完全捨棄 Lucene 索引,讓您可以重新建立索引以適應您的變更。它們可讓您重新建立 Lucene 索引,而不會有過時資料的 Lucene 區段持續存在。

Lucene 索引是一種專為快速搜尋設計的有損抽象。一旦將文件新增至索引,就不能假設原始資料可用。因此,Lucene 無法「修復」現有文件以反映 schema 的變更,它們必須再次建立索引。

有許多技術原因使得在不先刪除整個語料庫的情況下,難以編寫和維護正確重新擷取所有文件的程式碼,而且容易出錯。

因此,由於必須重新擷取所有文件,以確保抽象概念忠實地反映所有文件的新 schema,因此我們建議在確保沒有舊的 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 參數指定索引資料的位置 一節,了解索引檔案的位置。

請注意,您需要在叢集每個節點上的每個分片和每個複本中驗證索引已移除。僅查詢文件數量是不夠的,因為您可能沒有文件,但仍然有索引區段。

清除索引後,您可以透過重新執行原始索引程序來開始重新建立索引。

此方法的替代方法是使用更新的 schema 刪除並重新建立您的集合,然後在您可以負擔在重新建立索引期間讓您的集合離線的情況下重新建立索引。

索引到另一個集合

另一種方法是索引到新集合,並使用 Solr 的 集合別名 功能,將應用程式無縫指向新集合,而不會造成停機。

此選項僅適用於在 SolrCloud 模式下執行的 Solr 安裝。

使用此方法,您會將文件索引到使用您變更的新集合中,而且一旦索引和測試完成,就會建立一個別名,將您的前端指向新集合。從那時起,新的查詢和更新會無縫路由至新集合。

一旦別名就定位,而且您確信不再需要舊資料,您可以使用 Collections API DELETE 命令刪除舊集合。

此選項的一個優點是,如果您發現測試未發現的問題,您可以切換回舊集合。當然,在刪除舊集合之前,此選項可能需要更多資源。

不需要重新建立索引的變更

不需要或強烈表示需要重新建立索引的變更類型是不會影響索引的變更。

建立或修改請求處理器、搜尋元件和其他 solrconfig.xml 的元素不需要重新建立索引。

叢集和核心管理動作,例如新增節點、複本或新核心,或分割分片,也不需要重新建立索引。