Solr的schema.xml

schema.xml是Solr一個配置文件,它包含了你的文檔全部的字段,以及當文檔被加入索引或查詢字段時,這些字段是如何被處理的。這個文件被存儲在Solr主文件夾下的conf目錄下,默認的路徑./solr/conf/schema.xml,也能夠是Solr webapp的類加載器所能肯定的路徑。在下載的Solr包裏,有一個schema的樣例文件,用戶能夠從那個文件出發,來觀察如何編寫本身的Schema.xml。 ##type節點 先來看下type節點,這裏面定義FieldType子節點,包括name、class、positionIncrementGap等一些參數。必選參數:html

  • name:就是這個FieldType的名稱。
  • class:指向org.apache.solr.analysis包裏面對應的class名稱,用來定義這個類型的行爲。

其餘可選的屬性:web

  • sortMissingLast,sortMissingFirst兩個屬性是用在能夠內在使用String排序的類型上,默認false,適用於字段類型:string、boolean、sint、slong、sfloat、sdouble、pdate。
  • sortMissingLast="true",沒有該field的數據排在有該field的數據以後,而無論請求時的排序規則,在Java中對應的意思就是,該字段爲NULL,排在後面。
  • sortMissingFirst="true",排序規則與sortMissingLast相反。
  • positionIncrementGap:可選屬性,定義在同一個文檔中此類型數據的空白間隔,避免短語匹配錯誤。

在配置中,string類型的class是solr.StrField,而這個字段是不會被分析存儲的,也就是說不會被分詞。apache

而對於文章或者長文原本說,咱們必須對其進行分詞才能保證搜索某些字段時可以給出正確的結果。這時咱們就能夠用到另一個class,solr.TextField。它容許用戶經過分析器來定製索引和查詢,分析器包括一個分詞器(tokenizer)和多個過濾器(filter) 。app

一個標準的分詞:webapp

<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是針對於搜索。code

tokenizer節點固然就是對應分析鏈中的起點Tokenizer。接下來串聯了2個filter,分別是solr.StopFilterFactory,solr.LowerCaseFilterFactory。stop word filter就是把那些the、 of、 on之類的詞從token中去除掉,因爲這類詞在文檔中出現的頻率很是高,而對文檔的特徵又沒什麼影響,因此這類詞對查詢沒什麼意義。Lower case filter的做用是將全部的token轉換成小寫,也就是在最終的index中保存的都是小寫orm

你也能夠定義一個analyzer,例如使用mmseg4j進行中文分詞:xml

<fieldType name="text_zh" class="solr.TextField" positionIncrementGap="100">
    <analyzer> 
        <tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="complex" />
    </analyzer>
</fieldType>

filed節點

filed節點用於定義數據源字段所使用的搜索類型與相關設置。含有如下屬性htm

  • name:數據源字段名,搜索使用到。
  • type:搜索類型名例如中文ika搜索名text_ika,對應於fieldType中的name。不須要分詞的字符串類型,string便可,若是須要分詞,用上面配置好的分詞type。
  • indexed:是否被索引,只有設置爲true的字段才能進行搜索排序分片(earchable、 sortable、 facetable)。
  • stored:是否存儲內容,若是不須要存儲字段值,儘可能設置爲false以提升效率。
  • multiValued:是否爲多值類型,SOLR容許配置多個數據源字段存儲到一個搜索字段中。多個值必須爲true,不然有可能拋出異常。
  • omitNorms:是否忽略掉Norm,能夠節省內存空間,只有全文本field和need an index-time boost的field須要norm。(具體沒看懂,註釋裏有矛盾)
  • termVectors:當設置true,會存儲 term vector。當使用MoreLikeThis,用來做爲類似詞的field應該存儲起來。
  • termPositions:存儲 term vector中的地址信息,會消耗存儲開銷。
  • termOffsets:存儲 term vector 的偏移量,會消耗存儲開銷。
  • default:若是沒有屬性須要修改,就能夠用這個標識下。
  • docValues:Solr 4.2中加入了該屬性
  • docValuesFormat:可選的值爲Disk或者Memory

舉例:blog

<field name="manu_exact" type="string" indexed="false" stored="false" docValues="true" />

copyField節點

若是咱們的搜索須要搜索多個字段該怎麼辦呢?這時候,咱們就可使用copyField。代碼以下:

<copyField source="name" dest="all" maxChars="30000"/>
<copyField source="address" dest="all" maxChars="30000"/>

做用:

  • 將多個field的數據放在一塊兒同時搜索,提供速度
  • 將一個field的數據拷貝到另外一個,能夠用2種不一樣的方式來創建索引

咱們將全部的中文分詞字段所有拷貝至all中,當咱們進行全文檢索是,只用搜索all字段就OK了。

其包含屬性:

  • source:源field字段
  • dest:目標field字段
  • maxChars:最多拷貝多少字符

注意,這裏的目標字段必須支持多值,最好不要存儲,由於他只是作搜索。indexed爲true,stored爲false。

copyField節點和field節點都在fields節點以內。

dynamicField節點

動態字段,沒有具體名稱的字段,用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"/>

uniqueKey節點

solr必須設置一個惟一字段,常設置爲id,此惟一一段有uniqueKey節點指定。

例如:

<uniqueKey>id</uniqueKey>

defaultSearchField節點

默認搜索的字段,咱們已經將須要搜索的字段拷貝至all字段了,在這裏設爲all便可。

<defaultSearchField>all</defaultSearchField>

solrQueryParser節點

默認搜索操做符參數,及搜索短語間的邏輯,用AND增長準確率,用OR增長覆蓋面,建議用AND,也可在搜索語句中定義。例如搜索「手機 蘋果」,使用AND默認搜索爲「手機AND蘋果「。

<solrQueryParser defaultOperator="OR"/>

similarity節點

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等。 ##參考文章

相關文章
相關標籤/搜索