solr的schema.xml學習

 

此文轉載自益達的博客:http://iamyida.iteye.com/blog/2213354 數據庫

schema.xml是用來定義索引數據中的域的,包括域名稱,域類型,域是否索引,是否分詞,是否存儲,是否標準化即Norms,是否存儲項向量等等。tomcat

  schema.xml配置文件的根元素就是schema,有個name屬性,name屬性值能夠隨便配,根元素沒什麼好說的,schema元素下主要有兩個標籤元素即fieldfieldType,field表示域,用來定義域,fieldType用來定義域類型。dom

     

1.1. field元素有不少屬性性能

name: ui

表示域的名稱,是強制必須有的屬性編碼

type: url

域類型的名稱,與fieldType元素的name屬性值對應,也是強制必須有的屬性,不可省spa

required: 設計

表示這個域是不是必需要在document中存在,默認值爲false,若是此配置項設爲true,則你的document中必需要添加此域,不然你建立索引時會拋異常,例如:Document is missing mandatory field:xxx之類的異常,因爲lucene的索引結構是扁平化的,因此通常除了id主鍵域你能夠設置爲惟一域,其餘域required建議保持默認值false便可orm

indexed: 

true即表示須要對該域進行索引,通常若是你須要在該域上進行查詢或排序時,則須要配置爲true,默認值爲false

stored: 

表示是否須要把域值存儲到硬盤上,方便你後續查詢時能再次提取出來原樣顯示給用戶

docValues: 

表示此域是否須要添加一個docValues域,這對facet查詢,group分組,排序,function查詢有好處,儘管這個屬性不是必須的,但他能加快索引數據加載,對NRT近實時搜索比較友好,且更節省內存,但它也有一些限制,好比當前docValues域只支持strField,UUIDField,Trie*Field等域,且要求域的域值是單值不能是多值域

     

multiValued: 表示這個域是否能夠存儲多個值,若設置爲true,即表示這是一個多值域

     

omitNorms: 此屬性若設置爲true,即表示將忽略域值的長度標準化,忽略在索引過程當中對當前域的權重設置,且會節省內存。只有全文本域或者你須要在索引建立過程當中設置域的權重時才須要把這個值設爲false,對於基本數據類型且不分詞的域如intFeild,longField,StrField等默認此屬性值就是true,不然默認就是false.

     

termVectors: 設置爲true即表示須要爲該field存儲項向量信息,當你須要MoreLikeThis功能時,則須要將此屬性值設爲true,這樣會帶來一些性能提高。

     

termPositions: 是否存儲Term的起始位置信息,這會增大索引的體積,但高亮功能須要依賴此項設置,不然沒法高亮

     

termOffsets: 表示是否存儲索引的位置偏移量,高亮功能須要此項配置,當你使用SpanQuery時,此項配置會影響匹配的結果集

     

field裏還有兩個比較難理解的域,是Solr擴展的,在Lucene中沒有的概念,即dynamicField動態域和copyField複製域:

   動態域的屬性配置跟普通的field差很少就很少說了,惟一有點區別就是name的屬性值,能夠用通配符,這樣就能夠模糊匹配多個域啦,這樣設計的目的就是不用頻繁的去修改咱們的schema.xml中的field配置去增長field域啦,好比以前有個link_s域,某一天你想再增長一個url_s域,那你就須要去修改schema.xml配置文件,因爲schema.xml修改事後須要重啓tomcat才能生效,重啓即意味着程序的中斷,這每每是不可接受的。因此引入動態域來避免頻繁添加修改域,但前提是你的域須要符合你提早定義的動態域的域名稱命名規則哦。

   複製域即表示把某個域的值複製到一個目標域上面,那若是把多個域的值複製到一個目標域上面呢,你能夠進行屢次複製,體現到XML配置上就是相似這樣的配置:

     <copyField source="title" dest="text"/>

     <copyField source="body" dest="text"/>

  如上配置就表示把title和body這兩個域的值所有複製到text這個新域上面,惟一要注意的是,若是你只是複製單個域,那麼若是你被複制域自己就是多值域,那麼目標域也是多值域,這毋庸置疑,那若是你複製的是多個域,只要其中有一個域是多值域,那麼目標域就必定是多值域,這點必定要謹記。

  field說完了,接着說說fieldType元素,它用來定義域類型,solr內置的域類型有StrField,BoolField,TrieIntField,TrieFloatField,TrieLongField,TrieDoubleField,TrieDateField,BinaryField,RandomSortField,TextField等,其餘更多域類型請本身查閱Solr API文檔。

  StrField:這是一個不分詞的字符串域,它支持docValues域,但當爲其添加了docValues域,則要求只能是單值域且該域必須存在或者該域有默認值

  BoolField:boolean域,對應true/false

  TrieIntField, TrieFloatField, TrieLongField, TrieDoubleField這幾個都是默認的數字域,precisionStep屬性通常用於數字範圍查詢,precisionStep值越小,則索引時該域的域值分出的token個數越多,會增大硬盤上索引的體積,但它會加快數字範圍檢索的響應速度,positionIncrementGap屬性表示若是當前域是多值域時,多個值之間的間距,單值域,設置此項無心義。

  TrieDateField:顯然這是一個日期域類型,不過遺憾的是它支持1995-12-31T23:59:59Z這種格式的日期,比較坑爹,爲此我自定義了一個TrieCNDateField域類型,用於支持國人比較喜歡的yyyy-MM-dd HH:mm:ss格式的日期。源碼請參見個人上一篇博客。

  BinaryField:通過base64編碼的字符串域類型,即你須要把binary數據進行base64編碼才能被solr進行索引。

  

RandomSortField:隨機排序域類型,當你須要實現僞隨機排序時,請使用此域類型。

      

TextField:是用的最多的一種域類型,它須要進行分詞,因此它通常須要配置分詞器

。至於具體它如何配置IK分詞器,留到後續再說,這裏就不展開了。

     

      最後須要說的就是uniqueKey元素,它用來配置document的惟一標識域,即solr是用此域來決定增量導入時是否重複導入,若是id同樣,則不會重複導入,或者當你更新索引時,你能夠根據指定的uniqueKey域,來肯定一個document,而後對該document進行更新。總之,它是用來惟一肯定一個document的,跟數據庫表裏的主鍵id概念相似,前提是你uniqueKey裏配置的域名稱你須要提早使用field元素進行定義。

 fieldType元素還有一些額外的屬性也須要注意下,好比sortMissingFirst,sortMissingLast等: 

 sortMissingLast表示若是域值爲null,在根據當前域進行排序時,把包含null值的document排在最後一位,

 sortMissingFirst:與sortMissingLast對應的,不言自明瞭,你應該懂的。

  docValues:表示是否爲docValues域,通常排序,group,facet時會用到docValues域。

相關文章
相關標籤/搜索