欄位類型定義與屬性

欄位類型定義了當文件建立索引或查詢傳送到索引時,將在欄位上發生的分析。

欄位類型定義可以包含四種資訊:

  • 欄位類型的名稱 (強制)。

  • 實作類別名稱 (強制)。

  • 如果欄位類型是 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 中的文件分析 中描述。

實作類別負責確保正確處理欄位。在類別名稱中,字串 solrorg.apache.solr.schemaorg.apache.solr.analysis 的簡寫。因此,solr.TextField 實際上是 org.apache.solr.schema.TextField

欄位類型屬性

欄位類型 class 決定了欄位類型的大部分行為,但也可以定義可選屬性。例如,以下日期欄位類型的定義定義了兩個屬性 sortMissingLastomitNorms

<fieldType name="date" class="solr.DatePointField"
           sortMissingLast="true" omitNorms="true"/>

可以為給定的欄位類型指定的屬性分為三個主要類別:

  • 特定於欄位類型類別的屬性。

  • 一般屬性 Solr 支援任何欄位類型。

  • 欄位預設屬性,可以在欄位類型上指定,將由使用此類型的欄位繼承,而不是預設行為。

一般屬性

以下是一般欄位屬性:

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 索引回溯相容性僅支援預設編解碼器。如果您選擇在架構中自訂 postingsFormatdocValuesFormat,則升級到未來版本的 Solr 可能需要您切換回預設編解碼器,並最佳化您的索引以在升級前將其重寫為預設編解碼器,或是在升級後從頭開始重建整個索引。

欄位預設屬性

這些屬性可以在欄位類型或個別欄位上指定,以覆寫欄位類型提供的值。

每個屬性的預設值取決於底層的 FieldType 類別,而這又可能取決於 <schema/>version 屬性。下表包含 Solr 提供的大多數 FieldType 實作的預設值,假設架構宣告 version="1.6"

屬性 描述 隱含預設值

indexed

如果為 true,則欄位的值可以用於查詢以檢索匹配的文件。

true

stored

如果為 true,則查詢可以檢索欄位的實際值。

true

docValues

如果為 true,欄位的值將放入面向欄的 DocValues 結構中。

對於大多數欄位true

sortMissingFirstsortMissingLast

當排序欄位不存在時,控制文件的放置位置。

false

multiValued

如果為 true,表示單一文件可能包含此欄位類型的多個值。

false

uninvertible

如果為 true,表示 indexed="true" docValues="false" 的欄位可以在查詢時「反轉 (un-inverted)」,以建立大型記憶體資料結構,來取代 DocValues

false

omitNorms

如果為 true,則省略與此欄位相關聯的標準化 (norms)(這會停用欄位的長度標準化,並節省一些記憶體)。預設為所有基本(非分析)欄位類型 (如 int、float、data、bool 和 string) 為 true。 只有全文欄位或需要索引時提升 (index-time boost) 的欄位才需要標準化。

*

omitTermFreqAndPositions

如果為 true,則從此欄位的張貼中省略詞頻、位置和有效負載。對於不需要該資訊的欄位,這可以提高效能。它還減少了索引所需的儲存空間。在此選項設定的欄位上發出依賴位置的查詢將會靜默地找不到文件。此屬性預設為所有非文字欄位類型的 true。

*

omitPositions

omitTermFreqAndPositions 類似,但保留詞頻資訊。

*

termVectorstermPositionstermOffsetstermPayloads

這些選項指示 Solr 為每個文件維護完整詞向量,可選擇包含這些向量中每個詞彙出現的位置、偏移和有效負載資訊。這些可用於加速醒目提示和其他輔助功能,但會在索引大小方面造成相當大的成本。它們對於 Solr 的典型用途並非必要。

false

required

指示 Solr 拒絕任何嘗試新增不包含此欄位值的文件的嘗試。此屬性預設為 false。

false

useDocValuesAsStored

如果欄位已啟用 DocValues,則將此設定為 true 可允許欄位在 fl 參數中匹配「*」時,如同已儲存欄位一樣傳回(即使它具有 stored=false)。

true

large

大型欄位始終是延遲載入,並且只有在實際值小於 512KB 時才會佔用文件快取中的空間。此選項需要 stored="true"multiValued="false"。它適用於可能具有非常大的值的欄位,以便它們不會快取到記憶體中。

false

選擇適當的數值類型

對於一般的數值需求,請考慮使用 IntPointFieldLongPointFieldFloatPointFieldDoublePointField 類別之一,具體取決於您預期的特定值。這些基於「維度點 (Dimensional Point)」的數值類別使用特殊編碼的資料結構來支援有效範圍查詢,而與所用範圍的大小無關。根據需要,在這些欄位上啟用 DocValues,以進行排序和/或分面 (faceting)。

某些 Solr 功能可能尚不適用於「維度點」,在這種情況下,您可能需要考慮等效的 TrieIntFieldTrieLongFieldTrieFloatFieldTrieDoubleField 類別。這些欄位類型已過時,並可能在未來主要的 Solr 版本中移除,但如果需要,仍可使用它們。如果您希望最小化索引大小,請設定 precisionStep="0",但如果您希望使用者經常對數值類型進行範圍查詢,請使用預設的 precisionStep(不指定它)或將其指定為 precisionStep="8"(這是預設值)。這可以提高範圍查詢的速度,但會增加索引大小。

處理文字

正確處理文字將通過為使用者提供最佳的文字搜尋結果,讓您的使用者感到滿意。

一種技術是使用文字欄位作為關鍵字搜尋的全部捕獲 (catch-all)。大多數使用者對搜尋並不精通,最常見的搜尋很可能只是簡單的關鍵字搜尋。您可以使用 copyField 來接收各種欄位,並將它們全部匯集到單一文字欄位以進行關鍵字搜尋。

在 Solr 隨附的「techproducts」範例的架構中,copyField 宣告用於將 catnamemanufeaturesincludes 的內容轉儲到單一欄位 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。有關更多詳細資訊以及配置全域和每種類型相似度的範例,請參閱 相似度