Solr 6.7學習筆記(02)-- 配置文件 managed-schema (schema.xml)(3)


 

     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的值差不就是划分為多少個區間的意思。

 

下一篇

Solr 6.7學習筆記(02)-- 配置文件 managed-schema (schema.xml) - Analyzer, tokenizer(4)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM