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 使用 upconfig
和 downconfig
指令與 schema 檔案互動,以建立本機副本並上傳您的變更。相關選項請參閱Solr 控制指令碼參考和ZooKeeper 檔案管理。
Schema 檔案的結構
以下範例不是真實的 XML,但顯示組成 schema 檔案的主要元素。
<schema>
<types>
<fieldType>
<fields>
<field>
<copyField>
<dynamicField>
<similarity>
<uniqueKey>
</schema>
下方唯一鍵中描述的 uniqueKey
必須始終定義。
將會使用預設的 similarity
,但可以依照下方相似度章節的描述進行修改。
Types 和 fields 是選擇性的標籤
請注意, |
唯一鍵
uniqueKey
元素指定哪個欄位是文件的唯一識別符。雖然 uniqueKey
不是必要的,但幾乎總是您的應用程式設計所保證的。例如,如果您會更新索引中的文件,則應該使用 uniqueKey
。
您可以透過命名來定義唯一鍵欄位
<uniqueKey>id</uniqueKey>
Schema 預設值和 copyFields
不能用來填入 uniqueKey
欄位。 uniqueKey
的 fieldType
不應分析,且不得為任何 *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
作為預設值。
除了此頁面中提到的各種工廠之外,還有其他幾種可以使用的相似度實作,例如 SweetSpotSimilarityFactory
、ClassicSimilarityFactory
等。有關詳細資訊,請參閱 相似度工廠 的 Solr Javadocs。