Schema 元素

Solr 將關於預期它理解的欄位類型和欄位的詳細資訊儲存在 schema 檔案中。

Solr 的 Schema 檔案

Solr 的 schema 檔案的名稱和位置可能會因您最初設定 Solr 的方式或之後是否修改而有所不同。

  • managed-schema.xml 是 Solr 預設使用的 schema 檔案的名稱,以支援透過 Schema API無 Schema 模式功能在執行期間進行 schema 變更。

    如果您選擇,您可以明確設定受管理的 schema 功能以使用替代檔案名稱,但檔案的內容仍然會由 Solr 自動更新。

  • schema.xml 是 schema 檔案的傳統名稱,使用 ClassicIndexSchemaFactory 的使用者可以手動編輯。

  • 如果您正在使用 SolrCloud,您可能無法在本地檔案系統上找到任何具有這些名稱的檔案。您只能透過 Schema API(如果已啟用)或透過 Solr 管理介面的雲端畫面看到 schema。

無論您的安裝中使用哪個檔案名稱,檔案的結構都不會變更。但是,您與檔案互動的方式將會改變。如果您正在使用受管理的 schema,則預期您只會使用 Schema API 與檔案互動,並且永遠不會進行手動編輯。如果您不使用受管理的 schema,則您只能對檔案進行手動編輯,Schema API 將不會支援任何修改。

請注意,如果您還未使用 Schema API,但您使用 SolrCloud,您需要透過 ZooKeeper 使用 upconfigdownconfig 指令與 schema 檔案互動,以建立本機副本並上傳您的變更。相關選項請參閱Solr 控制指令碼參考ZooKeeper 檔案管理

Schema 檔案的結構

以下範例不是真實的 XML,但顯示組成 schema 檔案的主要元素。

<schema>
  <types>
    <fieldType>
  <fields>
    <field>
  <copyField>
  <dynamicField>
  <similarity>
  <uniqueKey>
</schema>

最常定義的元素是 typesfields,用於配置欄位類型和實際欄位。 欄位類型定義和屬性欄位章節描述如何為您的 schema 配置這些元素。

這些元素會由複製欄位中描述的 copyFields動態欄位中描述的 dynamicFields 來補充。

下方唯一鍵中描述的 uniqueKey 必須始終定義。

將會使用預設的 similarity,但可以依照下方相似度章節的描述進行修改。

Types 和 fields 是選擇性的標籤

請注意,typesfields 區段是選擇性的,這表示您可以自由地將頂層的 fielddynamicFieldcopyFieldfieldType 定義混合使用。這允許在您的 schema 中更邏輯地分組相關元素(例如將欄位與其欄位類型定義分組)。

唯一鍵

uniqueKey 元素指定哪個欄位是文件的唯一識別符。雖然 uniqueKey 不是必要的,但幾乎總是您的應用程式設計所保證的。例如,如果您會更新索引中的文件,則應該使用 uniqueKey

您可以透過命名來定義唯一鍵欄位

<uniqueKey>id</uniqueKey>

Schema 預設值和 copyFields 不能用來填入 uniqueKey 欄位。 uniqueKeyfieldType 不應分析,且不得為任何 *PointField 類型。您可以使用 UUIDUpdateProcessorFactory 來自動產生 uniqueKey 值。

此外,如果使用了 uniqueKey 欄位,但它是多值的(或從 fieldtype 繼承了多值性),則操作將會失敗。然而,只要欄位使用正確,uniqueKey 將會繼續運作。

相似度

相似度是 Lucene 用於在搜尋中對文件評分的類別。

每個集合都有一個「全域」相似度。預設情況下,Solr 使用隱式的SchemaSimilarityFactory,它允許為每個欄位類型配置特定的「每種類型」相似度,並且對於任何沒有明確相似度的欄位類型,隱式使用 BM25Similarity

您可以透過在 schema 中任何單一欄位類型之外宣告頂層 <similarity/> 元素來覆寫此預設行為。此相似度宣告可以直接參考具有無參數建構子的類別名稱,例如以下範例顯示 BM25Similarity

<similarity class="org.apache.lucene.search.similarities.BM25Similarity"/>

或者參考 SimilarityFactory 實作

<similarity class="solr.BM25SimilarityFactory"/>

當使用相似度工廠時,可以指定選用的初始化參數

<similarity class="solr.DFRSimilarityFactory">
  <str name="basicModel">P</str>
  <str name="afterEffect">L</str>
  <str name="normalization">H2</str>
  <float name="c">7</float>
</similarity>

在大多數情況下,如果您的 schema 也包含欄位類型特定的 <similarity/> 宣告,則像這樣指定全域層級的相似度會導致錯誤。一個主要的例外是您可以明確宣告 SchemaSimilarityFactory,並使用已配置特定相似度的欄位類型(由 defaultSimFromFieldType 指定)名稱,來指定所有未宣告明確相似度的欄位類型的預設行為。

<similarity class="solr.SchemaSimilarityFactory">
  <str name="defaultSimFromFieldType">text_dfr</str>
</similarity>

<fieldType name="text_dfr" class="solr.TextField">
  <analyzer ... />
  <similarity class="solr.DFRSimilarityFactory">
    <str name="basicModel">I(F)</str>
    <str name="afterEffect">B</str>
    <str name="normalization">H3</str>
    <float name="mu">900</float>
  </similarity>
</fieldType>

<fieldType name="text_ib" class="solr.TextField">
  <analyzer ... />
  <similarity class="solr.IBSimilarityFactory">
    <str name="distribution">SPL</str>
    <str name="lambda">DF</str>
    <str name="normalization">H2</str>
  </similarity>
</fieldType>

<fieldType name="text_other" class="solr.TextField">
  <analyzer ... />
</fieldType>

在上面的範例中,IBSimilarityFactory (使用基於資訊的模型)將用於任何 text_ib 類型的欄位,而 DFRSimilarityFactory(與隨機發散)將用於任何 text_dfr 類型的欄位,以及任何使用未明確指定 <similarity/> 的類型的欄位。

如果明確宣告 SchemaSimilarityFactory 但未配置 defaultSimFromFieldType,則會隱式使用 BM25Similarity 作為預設值。

除了此頁面中提到的各種工廠之外,還有其他幾種可以使用的相似度實作,例如 SweetSpotSimilarityFactoryClassicSimilarityFactory 等。有關詳細資訊,請參閱 相似度工廠 的 Solr Javadocs。