schema.xml是用來定義索引資料中的域的,包括域名稱,域類型,域是否索引,是否分詞,是否存儲,是否标準化即norms,是否存儲項向量等等。
schema.xml配置檔案的根元素就是schema,有個name屬性,name屬性值可以随便配,根元素沒什麼好說的,schema元素下主要有兩個标簽元素即field和fieldtype,field表示域,用來定義域,fieldtype用來定義域類型。
field元素有很多屬性可以配置,我一一做個解釋:
name: 表示域的名稱,是強制必須有的屬性
type: 域類型的名稱,與fieldtype元素的name屬性值對應,也是強制必須有的屬性,不可省
required: 表示這個域是否是必須要在document中存在,預設值為false,如果此配置項設為true,則你的document中必須要添加此域,否則你建立索引時會抛異常,例如:document is missing mandatory field:xxx之類的異常,由于lucene的索引結構是扁平化的,是以一般除了id主鍵域你可以設定為唯一域,其他域required建議保持預設值false即可
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分詞器,留到後續再說,這裡就不展開了。
fieldtype元素還有一些額外的屬性也需要注意下,比如sortmissingfirst,sortmissinglast等:
sortmissinglast表示如果域值為null,在根據目前域進行排序時,把包含null值的document排在最後一位,
sortmissingfirst:與sortmissinglast對應的,不言自明了,你應該懂的。
docvalues:表示是否為docvalues域,一般排序,group,facet時會用到docvalues域。
ok,schema.xml配置就說這麼多了,打完收工!!!都是一些理論性的東西,沒有什麼代碼,會比較枯燥,但看到很多小夥伴們在問,是以覺得還是有必要拿出來說一說,希望能幫到你們!
如果你還有什麼問題請加我Q-q:7-3-6-0-3-1-3-0-5,
或者加裙

一起交流學習!
轉載:http://iamyida.iteye.com/blog/2213354