solr的配置文件及其含義


   本節內容還是不會涉及到.net與數據庫的內容,但是不要着急,這都是學時solr必學要掌握的東西,solr可不是像其他的dll文件一樣,只需要引用就能調出方法與數據的,你不配置好是無法使用,前兩節主要是起鋪墊作用的,看起來會很枯燥無味的.

        本章節內容是為下一節連接數據庫做准備的,單拿出來看的話,會讓人很迷糊,沒關系,就當提前預習了,知道有這么個東西就行了,等下一節結合數據庫后就好理解了

      上一節我們已經完成了solr的基本配置,這里我們來將一下solr的配置文件,之前提到過,solr的主要步驟在於配置,直接講配置文件,很多沒接觸過的人看着會很吃力,這個需要結合鏈接數據庫講才好理解, 但是文章要一步一步的寫,對於已經接觸過solr的人那就就沒什么問題了,這里將為大家提供盡可能詳細的配置講解,新人可以先了解一下,等下節開始講解鏈接數據庫就容易理解了.

 

(一)首先列出solr的幾個重要配置文件名稱

     1.solr.xml(多個)

     2.server.xml(tomcat的文件)

     3. schema.xml

     4. solrconfig.xml

     5. data-config.xml(鏈接數據庫的配置文件,需要自己創建)

那么接下來我們就開始講解這些配置文件

 

(1)solr.xml

      這個文件主要有兩個地方,第一個地方是在上一節我們配置solr中手動創建的,忘了的朋友可以回去看一下,這個文件主要是建立tomcat 與solr之間的關系的,它的作用是讓tomcat找到你所配置的solr.代碼如下:

<?xml version="1.0" encoding="utf-8"?>
<Context docBase="C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\solr.war" debug="0" crossContext="true">
  <Environment name="solr/home" type="java.lang.String" value="C:\Program Files\Apache Software Foundation\Tomcat 7.0\solr" override="true"/>
</Context>

      第二個solr.xml的位置在C:\Program Files\Apache Software Foundation\Tomcat 7.0\solr,這個是solr文件中自帶的(就是上一節我們復制到tomcat下的文件夾),我們來看看他的代碼.

復制代碼
<solr>
  <solrcloud>
    <str name="host">${host:}</str>
    <int name="hostPort">${jetty.port:8983}</int>
    <str name="hostContext">${hostContext:solr}</str>
    <int name="zkClientTimeout">${zkClientTimeout:30000}</int>
    <bool name="genericCoreNodeNames">${genericCoreNodeNames:true}</bool>
  </solrcloud>
  <shardHandlerFactory name="shardHandlerFactory"
    class="HttpShardHandlerFactory">
    <int name="socketTimeout">${socketTimeout:0}</int>
    <int name="connTimeout">${connTimeout:0}</int>
  </shardHandlerFactory>
</solr>
復制代碼

      這個文件是用來配置solr單核與多核模式的(多核模式的意思是在同一服務器下配置多個solr),上面的是單核模式,不需要做任何更改(多核需要修改),他默認匹配該文件夾下的collection1文件夾,其他的配置文件都在這個文件夾下,本節可我們主要講解單核模式,單核模式理解了,多核模式就容易理解了.(多核在后面的內容中會講到,畢竟是教程,需要從簡單的開始講起)

(2)server.xml

     這個文件是tomcat下的配置文件,位置在C:\Program Files\Apache Software Foundation\Tomcat 7.0\conf,檢查一下該文件下這段代碼:

  <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" 
               URIEncoding="UTF-8" />

     如果沒有URIEncoding="UTF-8",solr在查詢的時候可能會出現亂碼,有可能導致查不出東西來.

(3)schema.xml

     這個文件是solr 中比較重要的文件了 ,solr中的索引配置就寫在這個文件中了,文件的內容因為太多了,就沒法在文章里展示了,學習的朋友可以打開自己這個文件再結合文章去學習,s上一節中solr的分詞器就是復制在這里的,我們先來看一看它自帶的一些代碼.

    1.types節點

   

復制代碼
  <types>
    <fieldType name="string" class="solr.StrField" sortMissingLast="true" />
    <fieldType name="boolean" class="solr.BoolField" sortMissingLast="true"/>
    <fieldtype name="binary" class="solr.BinaryField"/>
    <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"/>
   ......................<!--下面的省略了-->
</type>
  
復制代碼

     這就是solr中支持的數據類型,它能匹配大部分數據庫所包含的類型,我們在配置索引的時候會用到,這里面定義FieldType子節點,包括name,class,positionIncrementGap等一些參數。

     name:就是這個FieldType的名稱。

     class:指向org.apache.solr.analysis包里面對應的class名稱,用來定義這個類型的行為(該名字對應的解析器)。

     可選的屬性:

     sortMissingLastsortMissingFirst兩個屬性是用在可以內在使用String排序的類型上(包括:string,boolean,sint,slong,sfloat,sdouble,pdate)。

     sortMissingLast="true",沒有該field的數據排在有該field的數據之后,而不管請求時的排序規則。值默認是設置成false

     sortMissingFirst="true",跟上面倒過來唄。值默認是設置成false

 

    2.fields節點

          (1)field子節點

復制代碼
<fields>    
  <field name="_version_" type="long" indexed="true" stored="true"/>
   
   <!-- points to the root document of a block of nested documents. Required for nested
      document support, may be removed otherwise
   -->
   <field name="_root_" type="string" indexed="true" stored="false"/>

   <!-- Only remove the "id" field if you have a very good reason to. While not strictly
     required, it is highly recommended. A <uniqueKey> is present in almost all Solr 
     installations. See the <uniqueKey> declaration below where <uniqueKey> is set to "id".
   -->   
   <field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" /> 
        
   <field name="sku" type="text_en_splitting_tight" indexed="true" stored="true" omitNorms="true"/>
   <field name="name" type="text_general" indexed="true" stored="true"/>
   <field name="manu" type="text_general" indexed="true" stored="true" omitNorms="true"/>

.........................<!----省略->

</fields>    
復制代碼

 

 

       定義具體的字段(類似數據庫的字段),含有以下屬性:

       name:字段名

       type:之前定義過的各種FieldType

       indexed:是否被索引

       stored:是否被存儲(如果不需要存儲相應字段值,盡量設為false)

       multiValued:是否有多個值(對可能存在多值的字段盡量設置為true,避免建索引時拋出錯誤)

       這個就是配置索引的地方了,什么意思的,就數據存儲在數據庫下時是存在字段下的,比如id,name,在solr也需要有字段去存儲它啊,上面的name就是存儲的名字,可以隨便起,在data-conf.xml(下節會講)文件下會有數據庫與solr的映射表.

      (2)Copy Fields子字節

  <copyField source="cat" dest="text"/>
   <copyField source="name" dest="text"/>
   <copyField source="manu" dest="text"/>

      這段代碼也在<types></types>中,拷貝字段,就是把兩個字段結合到一個字段中,例:

復制代碼
<schema name="eshequn.post.db_post.0" version="1.1"  
    xmlns:xi="http://www.w3.org/2001/XInclude">  
     <fields>  
        <!-- for title -->  
        <field name="t" type="text" indexed="true" stored="false" />  
        <!-- for abstract -->  
        <field name="a" type="text" indexed="true" stored="false" />  
        <!-- for title and abstract -->  
        <field name="ta" type="text" indexed="true" stored="false" multiValued="true"/>  
    </fields>  
    <copyField source="t" dest="ta" />  
    <copyField source="a" dest="ta" />  
</schema>
復制代碼

      段t是文章的標題,字段a是文章的摘要,字段ta是文章標題和摘要的聯合。添加索引文檔時,只需要傳入t和a字段的內容,solr會自動索引ta字段。這 算不上多高級的功能,不過如果讓你來實現這個功能,你會怎么做呢?我接手的搜索系統原來就有類似的功能,它的做法是,將t和a字段的文本合並,塞到ta字 段,無可厚非的做法。不過,有人注意到lucene的Document類提供的public final Field[] getFields(String name)類似函數不?也就是說,lucene中的一個name可以對應多個Field。solr在添加索引時,會檢查field name是不是copyField集合中的source,是的話就以其value構造dest field。如果dest由多個source構成,就需要將其指定為multiValued。

     對於查詢來說,如果查詢字段要來自多個字段,一種選擇是使用CopyField,化多個字段為一個字段,缺點是不能區分各個字段的重要度差別。比如文章的標題和摘要,標題就要比摘要重要性更強,如果有這方面的要求,可以選擇查詢多個字段的做法。  

     (3)DynamicField

  <dynamicField name="*_i"  type="int"    indexed="true"  stored="true"/>
   <dynamicField name="*_is" type="int"    indexed="true"  stored="true"  multiValued="true"/>
   <dynamicField name="*_s"  type="string"  indexed="true"  stored="true" />
   <dynamicField name="*_ss" type="string"  indexed="true"  stored="true" multiValued="true"/>    

      動態字段(Dynamic fields)允許 solr 索引沒有在 schema 中明確定義的字段。這個在忘記定義一些字段時很有用。動態字段可以讓系統更靈活,通用性更強。動態字段和常規字段類似,除了它名字中包含一個通配符外,在索引文檔時,一個字段如果在常規字段中沒有匹配時,將到動態字段中匹配。假設schema中定義了一個叫*_i的動態動態字段,如果要索引一個叫 cost_i 的字段,但是 schema 中不存在 cost_i 的字段,這樣 cost_i  將被索引到 *_i 字段中。動態字段也是定義在 schema.xml 文件中,和其他字段一樣,它也有個名詞,字段類型,和屬性。建議在 schema.xml 定義一些基本的動態字段,以備擴展之用。

     (4)其他一些標簽

     < uniqueKey > id </ uniqueKey >

     文檔的唯一標識(就是主鍵,solr是將數據存儲在一個文件中的,當然就必須有主鍵了), 必須填寫這個field(除非該field被標記required="false"),否則solr建立索引報錯。

     < defaultSearchField > text </ defaultSearchField >

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

     < solrQueryParser defaultOperator =" OR " />

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM