本節內容還是不會涉及到.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名稱,用來定義這個類型的行為(該名字對應的解析器)。
可選的屬性:
sortMissingLast和sortMissingFirst兩個屬性是用在可以內在使用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"。