schema.xml是Solr一個配置文件,它包含了你的文檔全部的字段,以及當文檔被加入索引或查詢字段時,這些字段是如何被處理的。這個文件被存儲在Solr主文件夾下的conf目錄下,默認的路徑./solr/conf/schema.xml,也能夠是Solr webapp的類加載器所能肯定的路徑。在下載的Solr包裏,有一個schema的樣例文件,用戶能夠從那個文件出發,來觀察如何編寫本身的Schema.xml。 web
先來看下type節點,這裏面定義FieldType子節點,包括name、class、positionIncrementGap等一些參數。必選參數: apache
其餘可選的屬性: app
在配置中,string類型的class是solr.StrField,而這個字段是不會被分析存儲的,也就是說不會被分詞。 webapp
而對於文章或者長文原本說,咱們必須對其進行分詞才能保證搜索某些字段時可以給出正確的結果。這時咱們就能夠用到另一個 class,solr.TextField。它容許用戶經過分析器來定製索引和查詢,分析器包括一個分詞器(tokenizer)和多個過濾器 (filter) 。 spa
一個標準的分詞: code
<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100"> <analyzer type="index"> <tokenizer class="solr.StandardTokenizerFactory" /> <filter class="solr.LowerCaseFilterFactory" /> </analyzer> <analyzer type="query"> <tokenizer class="solr.StandardTokenizerFactory" /> <filter class="solr.LowerCaseFilterFactory" /> <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" /> </analyzer> </fieldType>
分詞用的依舊是fieldType,爲的是在下面的field中可以用到。有兩個analyzer,一個是index,一個是query,index是針對於全部,query是針對於搜索。 orm
tokenizer節點固然就是對應分析鏈中的起點Tokenizer。接下來串聯了2個filter,分別是 solr.StopFilterFactory,solr.LowerCaseFilterFactory。stop word filter就是把那些the、 of、 on之類的詞從token中去除掉,因爲這類詞在文檔中出現的頻率很是高,而對文檔的特徵又沒什麼影響,因此這類詞對查詢沒什麼意義。Lower case filter的做用是將全部的token轉換成小寫,也就是在最終的index中保存的都是小寫 xml
你也能夠定義一個analyzer,例如使用mmseg4j進行中文分詞: 排序
<fieldType name="text_zh" class="solr.TextField" positionIncrementGap="100"> <analyzer> <tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="complex" /> </analyzer> </fieldType>
filed節點用於定義數據源字段所使用的搜索類型與相關設置。含有如下屬性 索引
舉例:
<field name="manu_exact" type="string" indexed="false" stored="false" docValues="true" />
若是咱們的搜索須要搜索多個字段該怎麼辦呢?這時候,咱們就可使用copyField。代碼以下:
<copyField source="name" dest="all" maxChars="30000"/> <copyField source="address" dest="all" maxChars="30000"/>
做用:
咱們將全部的中文分詞字段所有拷貝至all中,當咱們進行全文檢索是,只用搜索all字段就OK了。
其包含屬性:
注意,這裏的目標字段必須支持多值,最好不要存儲,由於他只是作搜索。indexed爲true,stored爲false。
copyField節點和field節點都在fields節點以內。
動態字段,沒有具體名稱的字段,用dynamicField字段
如:name爲*_i,定義它的type爲int,那麼在使用這個字段的時候,任務以_i結果的字段都被認爲符合這個定義。如name_i、school_i
<dynamicField name="*_i" type="int" indexed="true" stored="true"/> <dynamicField name="*_s" type="string" indexed="true" stored="true"/> <dynamicField name="*_l" type="long" indexed="true" stored="true"/>
solr必須設置一個惟一字段,常設置爲id,此惟一一段有uniqueKey節點指定。
例如:
<uniqueKey>id</uniqueKey>
默認搜索的字段,咱們已經將須要搜索的字段拷貝至all字段了,在這裏設爲all便可。
<defaultSearchField>all</defaultSearchField>
默認搜索操做符參數,及搜索短語間的邏輯,用AND增長準確率,用OR增長覆蓋面,建議用AND,也可在搜索語句中定義。例如搜索「手機 蘋果」,使用AND默認搜索爲「手機AND蘋果「。
<solrQueryParser defaultOperator="OR"/>
Similarity式lucene中的一個類,用來在搜索過程當中對一個文檔進行評分。該類能夠作些修改以支持自定義的排序。在Solr4中,你可 覺得每個field配置一個不一樣的similarity,你也能夠在schema.xml中使用DefaultSimilarityFactory類配 置一個全局的similarity。
你可使用默認的工廠類來建立一個實例,例如:
<similarity class="solr.DefaultSimilarityFactory"/>
你也可使用其餘的工廠類,而後設置一些可選的初始化參數:
<similarity class="solr.DFRSimilarityFactory"> <str name="basicModel">P</str> <str name="afterEffect">L</str> <str name="normalization">H2</str> <float name="c">7</float> </similarity>
在Solr 4中,你能夠爲每個field配置:
<fieldType name="text_ib"> <analyzer/> <similarity class="solr.IBSimilarityFactory"> <str name="distribution">SPL</str> <str name="lambda">DF</str> <str name="normalization">H2</str> </similarity> </fieldType>
上面例子中,使用了DFRSimilarityFactory和IBSimilarityFactory,這裏還有一些其餘的實現類。在Solr 4.2中加入了SweetSpotSimilarityFactory。其餘還有:BM25SimilarityFactory、 SchemaSimilarityFactory等。