欄位類型定義與屬性
欄位類型定義了當文件建立索引或查詢傳送到索引時,將在欄位上發生的分析。
欄位類型定義可以包含四種資訊:
-
欄位類型的名稱 (強制)。
-
實作類別名稱 (強制)。
-
如果欄位類型是
TextField
,則為欄位類型提供欄位分析的描述。 -
欄位類型屬性 - 根據實作類別,某些屬性可能是強制性的。
Schema 中的欄位類型定義
欄位類型定義在集合的 schema 中。每個欄位類型都定義在 fieldType
元素之間。它們可以選擇性地分組在 types
元素內。
以下是一個名為 text_general
的類型的欄位類型定義範例:
<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100"> (1)
<analyzer type="index"> (2)
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<!-- in this example, we will only use synonyms at query time
<filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
-->
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
1 | 上面的範例中的第一行包含欄位類型名稱 text_general 和實作類別的名稱 solr.TextField 。 |
2 | 其餘的定義是關於欄位分析,在 Solr 中的文件分析 中描述。 |
實作類別負責確保正確處理欄位。在類別名稱中,字串 solr
是 org.apache.solr.schema
或 org.apache.solr.analysis
的簡寫。因此,solr.TextField
實際上是 org.apache.solr.schema.TextField
。
欄位類型屬性
欄位類型 class
決定了欄位類型的大部分行為,但也可以定義可選屬性。例如,以下日期欄位類型的定義定義了兩個屬性 sortMissingLast
和 omitNorms
。
<fieldType name="date" class="solr.DatePointField"
sortMissingLast="true" omitNorms="true"/>
可以為給定的欄位類型指定的屬性分為三個主要類別:
一般屬性
以下是一般欄位屬性:
name
-
必要
預設值:無
fieldType 的名稱。此值用於欄位定義的「type」屬性中。強烈建議名稱僅包含字母數字或底線字元,並且不要以數字開頭。目前並未嚴格強制執行此規定。
class
-
必要
預設值:無
用於儲存和索引此類型資料的類別名稱。請注意,您可以為包含的類別名稱加上「solr.」前綴,Solr 將自動找出要搜尋類別的套件 - 因此
solr.TextField
將會運作。如果您使用的是第三方類別,則可能需要使用完整類別名稱。
solr.TextField
的完整等效名稱為org.apache.solr.schema.TextField
。 positionIncrementGap
-
選用
預設值:無
對於多值欄位,指定多個值之間的距離,這可以防止偽造的片語匹配。
autoGeneratePhraseQueries
-
選用
預設值:無
適用於文字欄位。如果為
true
,Solr 會自動為相鄰的詞彙產生片語查詢。如果為false
,則必須將詞彙括在雙引號中才能被視為片語。 synonymQueryStyle
-
選用
預設值:
as_same_term
用於組合重疊查詢詞彙 (即同義詞) 分數的查詢。假設搜尋「藍色 T 恤」,且查詢時間同義詞為
tshirt,tee
。-
as_same_term
:混合詞彙,即SynonymQuery(tshirt,tee)
,其中每個詞彙的重要性相同。當詞彙是真正的同義詞時 (例如,「電視、電視」),此選項是適當的。 -
pick_best
:在評分Dismax(tee,tshirt)
時,選取最重要的同義詞。當同義詞擴展為下位詞(q=牛仔褲 w/ 牛仔褲⇒牛仔褲、褲子)
且您希望精確概念出現在父級和同級概念之前時,請使用此選項。 -
as_distinct_terms
:將評分偏向最重要的同義詞(褲子 OR 長褲)
。這篇部落格文章 Solr 同義詞和分類法:我的過錯 (Solr Synonyms and Taxonomies: Mea Culpa) 討論了 Solr 在同義詞擴展方面的行為。
-
enableGraphQueries
-
選用
預設值:
true
對於文字欄位,當使用
sow=false
(預設值)進行查詢時適用。對於包含圖形感知篩選器 (graph-aware filters) 的查詢分析器的欄位類型,請使用true
,例如,同義詞圖形篩選器 (Synonym Graph Filter) 和 詞語分隔符圖形篩選器 (Word Delimiter Graph Filter)。對於包含當某些標記 (token) 遺失時可以匹配文件的篩選器的查詢分析器欄位類型,請使用
false
,例如,Shingle 篩選器。
docValuesFormat
-
選用
預設值:無
定義用於此類型欄位的自訂
DocValuesFormat
。這需要使用架構感知編解碼器,例如 架構編解碼器工廠 (Schema Codec Factory)。 postingsFormat
-
選用
預設值:無
定義用於此類型欄位的自訂
PostingsFormat
。這需要使用架構感知編解碼器,例如 架構編解碼器工廠 (Schema Codec Factory)。
Lucene 索引回溯相容性僅支援預設編解碼器。如果您選擇在架構中自訂 |
欄位預設屬性
這些屬性可以在欄位類型或個別欄位上指定,以覆寫欄位類型提供的值。
每個屬性的預設值取決於底層的 FieldType
類別,而這又可能取決於 <schema/>
的 version
屬性。下表包含 Solr 提供的大多數 FieldType
實作的預設值,假設架構宣告 version="1.6"
。
屬性 | 描述 | 隱含預設值 |
---|---|---|
|
如果為 |
|
|
如果為 |
|
|
如果為 |
對於大多數欄位, |
|
當排序欄位不存在時,控制文件的放置位置。 |
|
|
如果為 |
|
|
如果為 |
|
|
如果為 |
* |
|
如果為 |
* |
|
與 |
* |
|
這些選項指示 Solr 為每個文件維護完整詞向量,可選擇包含這些向量中每個詞彙出現的位置、偏移和有效負載資訊。這些可用於加速醒目提示和其他輔助功能,但會在索引大小方面造成相當大的成本。它們對於 Solr 的典型用途並非必要。 |
|
|
指示 Solr 拒絕任何嘗試新增不包含此欄位值的文件的嘗試。此屬性預設為 false。 |
|
|
如果欄位已啟用 DocValues,則將此設定為 true 可允許欄位在 fl 參數中匹配「*」時,如同已儲存欄位一樣傳回(即使它具有 |
|
|
大型欄位始終是延遲載入,並且只有在實際值小於 512KB 時才會佔用文件快取中的空間。此選項需要 |
|
選擇適當的數值類型
對於一般的數值需求,請考慮使用 IntPointField
、LongPointField
、FloatPointField
或 DoublePointField
類別之一,具體取決於您預期的特定值。這些基於「維度點 (Dimensional Point)」的數值類別使用特殊編碼的資料結構來支援有效範圍查詢,而與所用範圍的大小無關。根據需要,在這些欄位上啟用 DocValues,以進行排序和/或分面 (faceting)。
某些 Solr 功能可能尚不適用於「維度點」,在這種情況下,您可能需要考慮等效的 TrieIntField
、TrieLongField
、TrieFloatField
和 TrieDoubleField
類別。這些欄位類型已過時,並可能在未來主要的 Solr 版本中移除,但如果需要,仍可使用它們。如果您希望最小化索引大小,請設定 precisionStep="0"
,但如果您希望使用者經常對數值類型進行範圍查詢,請使用預設的 precisionStep
(不指定它)或將其指定為 precisionStep="8"
(這是預設值)。這可以提高範圍查詢的速度,但會增加索引大小。
處理文字
正確處理文字將通過為使用者提供最佳的文字搜尋結果,讓您的使用者感到滿意。
一種技術是使用文字欄位作為關鍵字搜尋的全部捕獲 (catch-all)。大多數使用者對搜尋並不精通,最常見的搜尋很可能只是簡單的關鍵字搜尋。您可以使用 copyField
來接收各種欄位,並將它們全部匯集到單一文字欄位以進行關鍵字搜尋。
在 Solr 隨附的「techproducts」範例的架構中,copyField
宣告用於將 cat
、name
、manu
、features
和 includes
的內容轉儲到單一欄位 text
中。此外,最好將 ID
複製到 text
中,以防使用者想通過將產品編號傳遞到關鍵字搜尋來搜尋特定產品。
另一種技術是使用 copyField
以不同的方式使用相同的欄位。假設您有一個作者列表的欄位,如下所示
Schildt, Herbert; Wolpert, Lewis; Davies, P.
要按作者搜尋,您可以將欄位標記化、轉換為小寫並去除標點符號
schildt / herbert / wolpert / lewis / davies / p
對於排序,只需使用未標記化的欄位,轉換為小寫,並去除標點符號
schildt herbert wolpert lewis davies p
最後,對於分面,僅通過 StrField
使用主要作者
Schildt, Herbert
欄位類型相似度
欄位類型可以選擇指定一個 <similarity/>
,只要集合的「全域」相似度允許,該相似度就會在評分引用此類型欄位的文件時使用。
依預設,任何未定義相似度的欄位類型都使用 BM25Similarity
。有關更多詳細資訊以及配置全域和每種類型相似度的範例,請參閱 相似度。