schema配置文件

目錄java

1、字段配置(schema)... 2web

一、type節點... 2數據庫

二、fields節點... 4apache

三、拷貝字段... 4服務器

四、動態字段... 6網絡

二. schema.xml文檔註釋中的信息... 6app

一、改進性能措施:... 6函數

二、schema名字... 6性能

三、filedType. 7ui

四、fields. 8

五、其餘一些標籤... 9

附錄... 10

 

 

 

 

 

 

 

 

 

 

1、字段配置(schema)

schema.xml位於solr/conf/目錄下,相似於數據表配置文件,

定義了加入索引的數據的數據類型,主要包括typefields和其餘的一些缺省設置。

一、先來看下type節點,這裏面定義FieldType子節點,包括name,class,positionIncrementGap等一些參數。

  • name:就是這個FieldType的名稱。
  • class:指向org.apache.solr.analysis包裏面對應的class名稱,用來定義這個類型的行爲。
<types>
    <fieldType name="string" class="solr.StrField" sortMissingLast="true" />
    <fieldType name="boolean" class="solr.BoolField" sortMissingLast="true"/>
    <fieldType name="int" class="solr.TrieIntField" precisionStep="0" positionIncrementGap="0"/>
    <fieldType name="float" class="solr.TrieFloatField" precisionStep="0" positionIncrementGap="0"/>
    <fieldType name="long" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0"/>
    <fieldType name="double" class="solr.TrieDoubleField" precisionStep="0" positionIncrementGap="0"/>
    <fieldType name="tint" class="solr.TrieIntField" precisionStep="8" positionIncrementGap="0"/>
    <fieldType name="tfloat" class="solr.TrieFloatField" precisionStep="8" positionIncrementGap="0"/>
    <fieldType name="tlong" class="solr.TrieLongField" precisionStep="8" positionIncrementGap="0"/>
    <fieldType name="tdouble" class="solr.TrieDoubleField" precisionStep="8" positionIncrementGap="0"/>
    <fieldType name="date" class="solr.TrieDateField" precisionStep="0" positionIncrementGap="0"/>
    <fieldType name="tdate" class="solr.TrieDateField" precisionStep="6" positionIncrementGap="0"/>
    <fieldtype name="binary" class="solr.BinaryField"/>
    <fieldType name="pint" class="solr.IntField"/>
    <fieldType name="plong" class="solr.LongField"/>
    <fieldType name="pfloat" class="solr.FloatField"/>
    <fieldType name="pdouble" class="solr.DoubleField"/>
    <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" />
          </analyzer>
     </fieldType>
</types>

必要的時候fieldType還須要本身定義這個類型的數據在創建索引和進行查詢的時候要使用的分析器analyzer,包括分詞和過濾,以下:

<fieldType name="text_ws" class="solr.TextField" positionIncrementGap="100">  
  <analyzer>   
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>   
  </analyzer>   
</fieldType>   
<fieldType name="text" class="solr.TextField" positionIncrementGap="100">   
  <analyzer type="index">   
    <!--這個分詞包是空格分詞,在向索引庫添加text類型的索引時,Solr會首先用空格進行分詞   
         而後把分詞結果依次使用指定的過濾器進行過濾,最後剩下的結果,纔會加入到索引庫中以備查詢。   
      注意:Solr的analysis包並無帶支持中文的包,須要本身添加中文分詞器,google下。     
     -->   
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>   
        <!-- in this example, we will only use synonyms at query time   
        <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>  
        -->   
        <!-- Case insensitive stop word removal.   
          add enablePositionIncrements=true in both the index and query   
          analyzers to leave a 'gap' for more accurate phrase queries.   
        -->   
      <filter class="solr.StopFilterFactory"   
                ignoreCase="true"   
                words="stopwords.txt"   
                enablePositionIncrements="true"   
                />   
      <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1"   
              generateNumberParts="1" catenateWords="1" catenateNumbers="1"   
              catenateAll="0" splitOnCaseChange="1"/>   
      <filter class="solr.LowerCaseFilterFactory"/>   
      <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/>  
    </analyzer>   
    <analyzer type="query">   
      <tokenizer class="solr.WhitespaceTokenizerFactory"/>   
        <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true"   
                                                                          expand="true"/>  
        <filter class="solr.StopFilterFactory"   
                ignoreCase="true"   
                words="stopwords.txt"   
                enablePositionIncrements="true"   
                />   
        <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/>  
        <filter class="solr.LowerCaseFilterFactory"/>   
        <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/>  
      </analyzer>   
</fieldType>  

二、再來看下fields節點內定義具體的字段(相似數據庫的字段)

   含有如下屬性:

  • name:字段名
  • type:以前定義過的各類FieldType
  • indexed:是否被索引
  • stored:是否被存儲(若是不須要存儲相應字段值,儘可能設爲false)
  • multiValued:是否有多個值(對可能存在多值的字段儘可能設置爲true,避免建索引時拋出錯誤)

三、建議創建一個拷貝字段,將全部的 全文本 字段複製到一個字段中,以便進行統一的檢索:

<fields>
   <field name="_version_" type="long" indexed="true" stored="true"/>
   <field name="_type" type="int" stored="true" indexed="true"/>
   <field name="id" type="string" indexed="true" stored="true" required="true"/>
   <field name="website" type="string" indexed="true" stored="true"/>
   <field name="author" type="string" indexed="true" stored="true"/>
   <field name="editDate" type="long" indexed="true" stored="true"/>
   <!-- CAMPAIGN -->
   <field name="campaign_name" type="string" indexed="true" stored="true"/>
   <field name="campaign_startTime" type="long" indexed="true" stored="true"/>
   <field name="campaign_endTime" type="long" indexed="true" stored="true"/>
   <field name="campaign_isDeploy" type="boolean" indexed="true" stored="true"/>
   <field name="campaign_active" type="boolean" indexed="true" stored="true"/>
   <field name="campaign_isNewVisitor" type="boolean" indexed="true" stored="true"/>
   <field name="campaign_isReturnVisitor" type="boolean" indexed="true" stored="true"/>
   <field name="campaign_page" type="string" indexed="true" stored="true"/>
   <field name="campaign_page_url1" type="string" indexed="true" stored="true" multiValued="true"/>
   <field name="campaign_page_url2" type="string" indexed="true" stored="true" multiValued="true"/>
   <field name="campaign_page_url3" type="string" indexed="true" stored="true" multiValued="true"/>
   <field name="campaign_eleSelector" type="string" indexed="true" stored="true" multiValued="true"/>
   <field name="campaign_types" type="int" indexed="true" stored="true" multiValued="true"/>
   <field name="campaign_search" type="text_general" indexed="true" stored="true"/>
   <copyField source="campaign_name" dest="campaign_search" maxChars="256" />
      <!-- RESOURCE -->
   <field name="resource_name" type="string" indexed="true" stored="true"/>
   <field name="resource_exclude" type="boolean" indexed="true" stored="true"/>
   <field name="resource_ruletype" type="int" indexed="true" stored="true"/>
   <field name="resource_value" type="string" indexed="true" stored="true"/>
   <field name="resource_page_url1" type="string" indexed="true" stored="true" multiValued="true"/>
   <field name="resource_page_url2" type="string" indexed="true" stored="true" multiValued="true"/>
   <field name="resource_page_url3" type="string" indexed="true" stored="true" multiValued="true"/>
   <field name="resource_search" type="text_general" indexed="true" stored="true"/>
   <copyField source="resource_name" dest="resource_search" maxChars="256" />
   <!-- TEMPLATE -->
   <field name="template_name" type="string" indexed="true" stored="true"/>
   <field name="template_type" type="int" indexed="true" stored="true"/>
   <field name="template_category" type="string" indexed="true" stored="true"/>
   <field name="template_active" type="boolean" indexed="true" stored="true"/>
   <field name="template_search" type="text_general" indexed="true" stored="true"/>
   <copyField source="template_name" dest="template_search" maxChars="256" />
 </fields>
 
 <uniqueKey>id</uniqueKey>

以上代碼是我從AdSystem三期項目中摘抄出來的配置文件, 其中uniqueKey爲指定的ID字段,Solr根據此字段進行文檔的更新操做.

 

 

 

 

四、動態字段,沒有具體名稱的字段,用dynamicField字段

如:name*_i,定義它的typeint,那麼在使用這個字段的時候,任務以_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"/>  
<dynamicField name="*_t"  type="text"    indexed="true"  stored="true"/>  
<dynamicField name="*_b"  type="boolean" indexed="true"  stored="true"/>  
<dynamicField name="*_f"  type="float"  indexed="true"  stored="true"/>  
<dynamicField name="*_d"  type="double" indexed="true"  stored="true"/>  
<dynamicField name="*_dt" type="date"    indexed="true"  stored="true"/>  

 

二. schema.xml文檔註釋中的信息

一、爲了改進性能,能夠採起如下幾種措施:

  • 將全部只用於搜索的,而不須要做爲結果的field(特別是一些比較大的field)的stored設置爲false
  • 將不須要被用於搜索的,而只是做爲結果返回的field的indexed設置爲false
  • 刪除全部沒必要要的copyField聲明
  • 爲了索引字段的最小化和搜索的效率,將全部的 text fields的index都設置成field,而後使用copyField將他們都複製到一個總的 text field上,而後對他進行搜索。
  • 爲了最大化搜索效率,使用java編寫的客戶端與solr交互(使用流通訊)
  • 在服務器端運行JVM(省去網絡通訊),使用盡量高的Log輸出等級,減小日誌量。

二、schema名字

<schema name="example" version="1.5">

  • name:標識這個schema的名字
  • version:如今版本是1.5

 

三、filedType

<fieldType name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true" />
  • name:標識而已。
  • class和其餘屬性決定了這個fieldType的實際行爲。(class以solr開始的,都是在org.appache.solr.analysis包下)

可選的屬性:

  • sortMissingLast和sortMissingFirst兩個屬性是用在能夠內在使用String排序的類型上(包括:string,boolean,sint,slong,sfloat,sdouble,pdate)。
  • sortMissingLast="true",沒有該field的數據排在有該field的數據以後,而無論請求時的排序規則。
  • sortMissingFirst="true",跟上面倒過來唄。
  • 2個值默認是設置成false

StrField類型不被分析,而是被逐字地索引/存儲。

StrField和TextField都有一個可選的屬性「compressThreshold」,保證壓縮到不小於一個大小(單位:char)

<fieldType name="text" class="solr.TextField" positionIncrementGap="100">

solr.TextField 容許用戶經過分析器來定製索引和查詢,分析器包括 一個分詞器(tokenizer)和多個過濾器(filter)

  • positionIncrementGap:可選屬性,定義在同一個文檔中此類型數據的空白間隔,避免短語匹配錯誤。

空格分詞,精確匹配。

<tokenizer class="solr.WhitespaceTokenizerFactory" />

在分詞和匹配時,考慮 "-"連字符,字母數字的界限,非字母數字字符,這樣 "wifi"或"wi fi"都能匹配"Wi-Fi"。

<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1"catenateAll="0" splitOnCaseChange="1" />

 

同義詞

<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>

在禁用字(stopword)刪除後,在短語間增長間隔

stopword:即在創建索引過程當中(創建索引和搜索)被忽略的詞,好比is this等經常使用詞。在conf/stopwords.txt維護。

<filterclass="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />

四、fields

  • <field name="id" type="string" indexed="true" stored="true" required="true" />
  • name:標識而已。
  • type:先前定義的類型。
  • indexed:是否被用來創建索引(關係到搜索和排序)
  • stored:是否儲存
  • compressed:[false],是否使用gzip壓縮(只有TextField和StrField能夠壓縮)
  • mutiValued:是否包含多個值
  • omitNorms:是否忽略掉Norm,能夠節省內存空間,只有全文本field和need an index-time boost的field須要norm。(具體沒看懂,註釋裏有矛盾)
  • termVectors:[false],當設置true,會存儲 term vector。當使用MoreLikeThis,用來做爲類似詞的field應該存儲起來。
  • termPositions:存儲 term vector中的地址信息,會消耗存儲開銷。
  • termOffsets:存儲 term vector 的偏移量,會消耗存儲開銷。
  • default:若是沒有屬性須要修改,就能夠用這個標識下。

 

<field name="_version_" type="long" indexed="true" stored="true"/>
<field name="resource_name" type="string" indexed="true" stored="true"/>
<field name="resource_exclude" type="boolean" indexed="true" stored="true"/>
<field name="resource_ruletype" type="int" indexed="true" stored="true"/>
<field name="resource_search" type="text_general" indexed="true" stored="true"/>

 

 

一應俱全(有點誇張)的field,包含全部可搜索的text fields,經過copyField實現。

<field name="text" type="text" indexed="true" stored="false" multiValued="true" />
<copyField source="cat" dest="text" />
<copyField source="name" dest="text" />
<copyField source="manu" dest="text" />
<copyField source="features" dest="text" />
<copyField source="includes" dest="text" />

在添加索引時,將全部被拷貝field(如cat)中的數據拷貝到text field中

做用:

  • 將多個field的數據放在一塊兒同時搜索,提供速度
  • 將一個field的數據拷貝到另外一個,能夠用2種不一樣的方式來創建索引。
<dynamicField name="*_i" type="int" indexed="true" stored="true" />

若是一個field的名字沒有匹配到,那麼就會用動態field試圖匹配定義的各類模式。

  • "*"只能出如今模式的最前和最後
  • 較長的模式會被先去作匹配
  • 若是2個模式同時匹配上,最早定義的優先
<dynamicField name="*" type="ignored" multiValued="true" />

若是經過上面的匹配都沒找到,能夠定義這個,而後定義個type,當String處理。(通常不會發生)

但若不定義,找不到匹配會報錯。

五、其餘一些標籤

<uniqueKey>id</uniqueKey>

文檔的惟一標識, 必須填寫這個field(除非該field被標記required="false"),不然solr創建索引報錯。

<defaultSearchField>text</defaultSearchField>

若是搜索參數中沒有指定具體的field,那麼這是默認的域。

<solrQueryParser defaultOperator="OR" />

配置搜索參數短語間的邏輯,能夠是"AND|OR"。

 

附錄

 

<?xml version="1.0" encoding="UTF-8" ?>

  ...

<!--  

這是Solrschema文件,應該命名爲schema.xml,而且在solr homeconf目錄下

(如,默認在./solr/conf/schema.xml.

 

 有關如何根據須要定製化該文件,請參照:

 http://wiki.apache.org/solr/SchemaXml  性能須知: 這裏包含了不少實際應用不須要的可選項。 爲改善性能,你能夠:

  - 儘可能將全部僅用於搜索,而不用於實際返回的字段設置stored="false"

  - 儘可能將全部僅用於返回,而不用於搜索的字段設置indexed="false"

  - 去掉全部不須要的copyField 語句;

  - 爲了達到最佳的索引大小和搜索性能,對全部的文本字段設置indexed="false"

    使用copyField將他們拷貝到整合字段」name="text"的字段中,使用整合字段進行搜索;

  - 使用server模式來運行JVM,同時將log級別調高, 避免輸出全部請求的日誌。

-->

 

<schema name="example" version="1.5">

  ...

 

 <fields>

   <!-- fields各個屬性說明:

     name: 必須屬性 - 字段名

     type: 必須屬性 - <types>中定義的字段類型

     indexed: 若是字段須要被索引(用於搜索或排序),屬性值設置爲true

     stored: 若是字段內容須要被返回,值設置爲true

     docValues: 若是這個字段應該有文檔值(doc values),設置爲true。文檔值在門

           面搜索,分組,排序和函數查詢中會很是有用。雖然不是必須的,並且會致使生成

           索引變大變慢,但這樣設置會使索引加載更快,更加NRT友好,更高的內存使用效率。

           然而也有一些使用限制:目前僅支持StrField, UUIDField和全部 Trie*Fields,

           而且依賴字段類型, 可能要求字段爲單值(single-valued)的,必須的或者有默認值。

     multiValued: 若是這個字段在每一個文檔中可能包含多個值,設置爲true

     termVectors: [false] 設置爲true後,會保存所給字段的相關向量(vector

           當使用MoreLikeThis, 用於類似度判斷的字段須要設置爲stored來達到最佳性能.

     termPositions: 保存和向量相關的位置信息,會增長存儲開銷

     termOffsets: 保存 offset 和向量相關的信息,會增長存儲開銷

     required: 字段必須有值,不然會拋異常

     default: 在增長文檔時,能夠根據須要爲字段設置一個默認值,防止爲空

   -->

 

   <!-- 字段名由字母數字下劃線組成,且不能以數字開頭。兩端爲下劃線的字段爲保留字段,

      (_version_)

    -->

        

   <field name="id" type="string" indexed="true" stored="true"

           required="true" multiValued="false" />

 

   <field name="title" type="text_general" indexed="true"

           stored="true" multiValued="true"/>

   <field name="description" type="text_general" indexed="true" stored="true"/>

   <field name="author" type="text_general" indexed="true" stored="true"/>

   <field name="keywords" type="text_general" indexed="true" stored="true"/>

   <field name="category" type="text_general" indexed="true" stored="true"/>

   <field name="url" type="text_general" indexed="true" stored="true"/>

   <field name="last_modified" type="date" indexed="true" stored="true"/>

   <!-- 注意: 爲了節省空間,這個字段默認不被索引, 因使用copyField被拷貝到了名爲text的字段中

      。用於內容返回和高亮。搜索時使用text字段

   -->

   <field name="content" type="text_general" indexed="false"

           stored="true" multiValued="true"/>

   

   <!-- 整合字段(catchall field), 包含其餘可搜索的字段 (經過copyField實現) -->

   <field name="text" type="text_general" indexed="true"

           stored="false" multiValued="true"/>

 

   <!-- 保留字段,不能刪除,不然報錯 -->

   <field name="_version_" type="long" indexed="true" stored="true"/>

   

 </fields>

 

 

 <!-- 文檔的惟一標識,可理解爲主鍵,除非標識爲required="false", 不然值不能爲空-->

 <uniqueKey>id</uniqueKey>

 

  <!-- 拷貝須要索引的字段到整合字段中  -->

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

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

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

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

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

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

 

  <types>

    <!-- 字段類型定義 -->

    <fieldType name="string" class="solr.StrField" sortMissingLast="true" />

    <fieldType name="boolean" class="solr.BoolField" sortMissingLast="true"/>

    <fieldType name="int" class="solr.TrieIntField" precisionStep="0"

        positionIncrementGap="0"/>

    <fieldType name="float" class="solr.TrieFloatField" precisionStep="0"

        positionIncrementGap="0"/>

    <fieldType name="long" class="solr.TrieLongField" precisionStep="0"

        positionIncrementGap="0"/>

    <fieldType name="double" class="solr.TrieDoubleField" precisionStep="0"

        positionIncrementGap="0"/>

    <fieldType name="date" class="solr.TrieDateField" precisionStep="0"

        positionIncrementGap="0"/>

      ...

    <!-- Thai,泰語類型字段 -->

    <fieldType name="text_th" class="solr.TextField" positionIncrementGap="100">

      <analyzer>

        <tokenizer class="solr.StandardTokenizerFactory"/>

        <filter class="solr.LowerCaseFilterFactory"/>

        <filter class="solr.ThaiWordFilterFactory"/>

        <filter class="solr.StopFilterFactory" ignoreCase="true"

            words="lang/stopwords_th.txt" />

      </analyzer>

    </fieldType>

    

    <!-- Turkish,土耳其語類型字段 -->

    <fieldType name="text_tr" class="solr.TextField" positionIncrementGap="100">

      <analyzer>

        <tokenizer class="solr.StandardTokenizerFactory"/>

        <filter class="solr.TurkishLowerCaseFilterFactory"/>

        <filter class="solr.StopFilterFactory" ignoreCase="false"

            words="lang/stopwords_tr.txt" />

        <filter class="solr.SnowballPorterFilterFactory" language="Turkish"/>

      </analyzer>

    </fieldType>

    

    <!-- Chinese,須要咱們本身配置,整合mmseg4j就配置在這裏 -->

 </types>

 

  <!-- 文檔類似度判斷依賴於文檔類似度得分。 一個自定義的 Similarity SimilarityFactory

     能夠在這裏指定, 可是默認的設置已經適合大多數應用。能夠參考:

     http://wiki.apache.org/solr/SchemaXml#Similarity

    -->

  <!--

     <similarity class="com.example.solr.CustomSimilarityFactory">

       <str name="paramkey">param value</str>

     </similarity>

    -->

 

</schema>

相關文章
相關標籤/搜索