5. <fieldType>
fieldType主要定義了一些字段類型,其name屬性值用於前面<field>中的type屬性的值。e.g. <fieldType name="string" class="solr.StrField" sortMissingLast="true" /> 其中class屬性中"solr"是org.apache.solr.schema這個包名的縮寫。
fieldType的屬性:
1)name 由字母、數字和下划線組成。不能以數字開頭。此值用於前面<field>中的type屬性的值。
2)class 此值表明索引並存儲此fieldType的數據的類型(e.g 字符類型,數字類型,日期類型...)。如果此類不是solr提供的(自定義的或第三方的類),則不能用"solr.",需要寫類的全路徑名。
3)positionIncrementGap 值為整數,用於multiValued="true"的字段,指定多個值之間的距離,以防出現假的短語匹配。
比如描述書本作者的字段是有多個值的,假設有兩個作者:John Smith 和 Mike Jackson,我們搜索"Smith Mike"這個作者,如果positionIncrementGap值設成0,則此記錄就會被認為是匹配搜索條件的,實際上是不匹配的。對於這種情況,我們應該把此值設置成一個較大的值,比如100。
4) autoGeneratePhaseQueries 值為布爾類型。默認值為false。對於文本字段,如果設置為TRUE的話,Solr自動為相鄰的terms生成短語查詢。如果為FALSE,包含在雙引號內的terms才會被認為是短語。
舉個粟子:索引中的文本內容為:春花秋月何時了...一江春水向東流。 我們在搜索的輸入框里輸入"春花"(注意不輸入兩個雙引號),如果autoGeneratePhaseQueries 為true,我們加上highlight的話,返回的匹配結果為: <em>春花</em>秋月何時了...一江春水向東流。 如果值為false,則返回結果為<em>春</em><em>花</em>秋月何時了...一江<em>春</em>水向東流。
如果值為false,我們還是想要進行短語查詢,可在輸入框里輸入"春花"(注意需要加上兩個雙引號)。
5)docValuesFormat 自定義docValues的格式。設置此值的話,必須在solrconfig.xml里配置schema-aware codec。如:
<codecFactory class="solr.SchemaCodecFactory" />
在網上搜了一下,只看到有兩個值 Memory 和 Disk。猜想這個屬性的作用應該是定義docValues值是存在硬盤上還是存在內存中吧。
6)postingsFormat 自定義PostingsFormat。設置此值的話,必須在solrconfig.xml里配置schema-aware codec。不太清楚具體有什么用。
注:盡量不要使用docValuesFormat和postingFormat。Solr的guideline上有一段話,翻譯如下:
僅當使用默認的codec 時,Lucene索引才支持向后兼容。因此,如果使用了這兩個屬性,那么將來想要升級到更高版本的Solr 時,需要你切換回默認的codec,然后優化現有的索引或者重新建立整個索引。
以下的屬性也同時存在於<field>里,如果<field>里的值會覆蓋<fieldType>里的值。
7)indexed 布爾值。true表示進行索引。
8)stored 布爾值。true表示進行存儲。
9)docValues 布爾值。true表示field的值將會被存儲於面向列的數據結構中。
10)sortMissingFirst 布爾值。true表示排序的時候,此field值為空的記錄排在此field值不為空的記錄的前面。
11)sortMissingLast 布爾值 。意思和sortMissingFirst相反。
12)multiValues 布爾值。
13)omitNorms 布爾值。
14)omitTermFreqAndPositions 布爾值。忽略term frequency, positions 和 payloads。所有非文本類型字段,此默認值是true。
15)omitPositions 布爾值。布爾值。忽略positions。
16)termVectors, termPositions, termOffsets 和 termPayloads 布爾值。
17)required 布爾值。
18)useDocValuesAsStored 布爾值。
19)large 布爾值。默認FALSE
fieldType里class屬性的一些值:
1)BinaryField 二進制數據
2)BoolField 布爾值數據。以"1"、"T"和"t"開頭的字符都被認為是true,其它都是false
3)CollationField 參見 https://cwiki.apache.org/confluence/display/solr/Language+Analysis#LanguageAnalysis-UnicodeCollation
4)CurrencyField 支持貨幣及匯率。
5)DateRangeField 日期
6)ExternalFileField 從硬盤上的某個文件獲取值
7)EnumField 允許定義一組枚舉值,用於對不能根據字母或數值排序的字段進行排序。
<fieldType name="priorityLevel" class="solr.EnumField" enumsConfig="enumsConfig.xml" enumName="priority" />
enumsConfig的值是枚舉值的配置文件。enumsConfig.xml 示例:
<?xml version="1.0" ?>
<enumsConfig>
<enum name="priority"><!-- 上面<fieldType> 里的enumName的值 -->
<value>Low</value>
<value>Medium</value>
<value>High</value>
</enum>
<enum name="risk"> ... 其它一些枚舉名及其值列表 ...</enum>
</enumsConfig>
8)ICUCollationField 參見 https://cwiki.apache.org/confluence/display/solr/Language+Analysis#LanguageAnalysis-UnicodeCollation
9)LatLonPointSpatialField 經緯度。用於空間搜索。通常表示為"lat,lon"
10)PointType 單值多維度點值。個人理解是指坐標值,比如二維或二維坐標。
11)PreAnalyzedField 參見 https://cwiki.apache.org/confluence/display/solr/Working+with+External+Files+and+Processes#WorkingwithExternalFilesandProcesses-ThePreAnalyzedFieldType
12)RandomSortField 不包含值。在此類型的字段上排序,將會返回隨機的排序結果。
13)SpatialRecursivePrefixTreeFieldType 接受"latitue,logitude"格式的字符串或WKT格式。完全不明白是啥。
14)StrField UTF-8或Unicode的字符串。用於較小的字段,並且不被切分或分析(個人理解:此字段的值不會被拆分,被做為一個整體進行索引)。限制小於32K
15)TextField
16)TrieDateField, TrieDoubleField, TrieFloatField, TrieIntField, TrieLongField 見下面的說明
17)DatePointField, DoublePointField, FloatPointField, IntPointField, LongPointField 見下面的說明
18)UUIDField 定義一個document的唯一值。官方文檔提到在SolrCloud環境下,不能保證唯一性,不建議使用,推薦使用UUIDUpdateProcessorFactory去生成UUID。
另外,在solr給的sample文件里,對於數值類型,定義了如下三個fieldType(以int為例):
a). <fieldType name="pint" class="solr.IntPointField" docValues="true" />
b). <fieldType name="int" class="solr.TrieIntField" docValues="true" precisionStep="0" positionIncrementGap="0"/>
c). <fieldType name="tint" class="solr.TrieIntField" docValues="true" precisionStep="8" positionIncrementGap="0"/>
對於a),對於數值類型的field,索引時使用KD-trees。 sample文件里提到要比 Trie*Field更快更高效,但是不支持某些特性。並未說明不支持哪些特性,所以並不推薦使用
對於b),通常用於確定性搜索,比如要搜索年齡是18的人。
對於c),用於范圍搜索,比如要搜索某個年齡段的人。
也就是說,我們如果要對某項數據(比如人的信息,其中包含年齡字段)進行索引,一個人有唯一的年齡值,但是我們搜索的時候,可能需要進行確定年齡的搜索和年齡段的搜索,那么我們就需要定義兩個年齡相關的field,其中一個field的fieldType為int,另一個field的fieldType為tint。
對 precisionStep 的一些說明:
比如 單個車的價格是不一樣的,我們通常會查詢某個價格范圍內的車子信息。假設所有車輛價格范圍是1萬~1000萬,為了加快查詢速度,會把這個價格區間划分為幾個區間進行索引。precisionStep的值差不就是划分為多少個區間的意思。
下一篇