-
sortMissingLast = true时,那些在该<field>上没有值的documents将被排在那些在该<field>上有值的documents之后。
<?xml version="1.0" ?>
The Solr schema file. This file should be named "schema.xml" and should be in the conf directory under the solr home (i.e. ./solr/conf/schema.xml by default) or located where the classloader for the Solr webapp can find it.
For more information,on how to customize this file,please see… wiki.apache.org/solr/SchemaXml
<schema name="solr" version="1.1">
資料型態,你的資料可能要分很多不同型態做資料建置以便solr引擎做檢索,就像一般資料庫一樣,要對存入的資料做型態分類. 以下有string,boolean,integer,long,float,double 等等的資料型態,就依你的須求做設定. 每一個fieldtype 都有幾個參數可設定,其中name就是你給這個fieldtype的名子,你可以隨你的方便取名. class是solr用的,就不可以亂取,要針對你這個fieldtype的資料型態來告訴solr這個fieldtype裡的資料是什麼樣類型的資料,如 integer,text,string,long等等.
後面的 sortMissingLast,omitNorms等設定你可以參考solr wiki schemalXml的介紹,再依你的須求使用. 請參考下列範例.
<types>
<fieldtype name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true"/>
<fieldtype name="boolean" class="solr.BoolField" sortMissingLast="true" omitNorms="true"/>
<fieldtype name="integer" class="solr.IntField" omitNorms="true"/>
<fieldtype name="long" class="solr.LongField" omitNorms="true"/>
<fieldtype name="float" class="solr.FloatField" omitNorms="true"/>
<fieldtype name="double" class="solr.DoubleField" omitNorms="true"/>
<fieldtype name="sint" class="solr.SortableIntField" sortMissingLast="true" omitNorms="true"/>
<fieldtype name="slong" class="solr.SortableLongField" sortMissingLast="true" omitNorms="true"/>
<fieldtype name="sfloat" class="solr.SortableFloatField" sortMissingLast="true" omitNorms="true"/>
<fieldtype name="sdouble" class="solr.SortableDoubleField" sortMissingLast="true" omitNorms="true"/>
<fieldtype name="date" class="solr.DateField" sortMissingLast="true" omitNorms="true"/> 如果是TextField的資料型態,你可以用不同的Analyzer,Tokenizer,Filter對這個fieldtype的資料做處理. 像是中文切詞,刪除前後空白,或同義詞等等. 可依你的須求使用. 請參考下列範例. <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"> <tokenizer class="solr.WhitespaceTokenizerFactory"/> <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/> <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0"/> <filter class="solr.LowerCaseFilterFactory"/> <filter class="solr.EnglishPorterFilterFactory" protected="protwords.txt"/> <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> </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"/> <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0"/> <filter class="solr.LowerCaseFilterFactory"/> <filter class="solr.EnglishPorterFilterFactory" protected="protwords.txt"/> <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> </analyzer> </fieldtype> <fieldtype name="textTight" class="solr.TextField" positionIncrementGap="100" > <analyzer> <tokenizer class="solr.WhitespaceTokenizerFactory"/> <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="false"/> <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/> <filter class="solr.WordDelimiterFilterFactory" generateWordParts="0" generateNumberParts="0" catenateWords="1" catenateNumbers="1" catenateAll="0"/> <filter class="solr.LowerCaseFilterFactory"/> <filter class="solr.EnglishPorterFilterFactory" protected="protwords.txt"/> <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> </analyzer> </fieldtype> </types> 設置好資料fieldType的型態後,就是將這些fieldType套入對應的document fields. 只能多不能少. 也就是說假設你有一個document裡有 id,name,default等資料,你的schema.xml不可以只有id,default這兩個field. 你一定要還要有name這個field. 但是你schema.xml裡若有id,defualt,text這四個欄位,你的document卻可以只有id,default這兩個欄位. <fields> <field name="id" type="string" indexed="true" stored="true"/> 上面這個欄位(field)是給你document裡的id欄用,型態為string,要index,也要儲存在你的資料庫裡 <field name="default" type="text" indexed="true" stored="false" multiValued="true"/> <field name="name" type="text" indexed="true" stored="false" multiValued="true"/> dynamicField就是動態欄位,id_i等等)都套用這個設定. <dynamicField name="*_i" type="integer" indexed="true" stored="true"/> <dynamicField name="*_t" type="text" indexed="true" stored="true"/> <dynamicField name="*_f" type="float" indexed="true" stored="true"/> <dynamicField name="*_b" type="boolean" indexed="true" stored="true"/> <dynamicField name="*_d" type="date" indexed="true" stored="true"/> <dynamicField name="*_s" type="string" indexed="true" stored="true"/> <dynamicField name="*_ri" type="sint" indexed="true" stored="true"/> <dynamicField name="*_rf" type="sfloat" indexed="true" stored="true"/> <dynamicField name="*_facet" type="string" indexed="true" stored="true"/> </fields> uniqueKey就像一般database的primary key一樣,也就是說整個資料庫裡的每一筆資料的id欄位不可以與另一筆資料的id欄位有相同值. <uniqueKey>id</uniqueKey> defaultSearchField就是你在做query搜尋時若不指定特定欄位做檢索時,Solr就會只查這個欄位. <defaultSearchField>default</defaultSearchField> copyField是用來複製你一個欄位裡的值到另一欄位用. 如你可以將name裡的東西copy到default裡,這樣solr做檢索時也會檢索到name裡的東西. <copyField source="name" dest="default"/> 這裡defaultOperator設為 "AND",就是說當你輸入的查尋詞句有空白時 ex. "遠東 餐廳",Solr搜尋解析器會當做你的query指令為"遠東AND餐廳". 若是設為 "OR" 就會變成"遠東OR餐廳". <solrQueryParser defaultOperator="AND"/> </schema> 這就是一個簡單的schema.xml介紹