Solr5之Schema詳解

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

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

field 元素有不少屬性能夠配置,我一一作個解釋:dom

name: 表示域的名稱,是強制必須有的屬性性能

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

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

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

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

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

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 域。

OK , schema.xml 配置就說這麼多了,但願有所幫助

相關文章
相關標籤/搜索