SOLR 中 Schema.xml 的filedType 的一些屬性的理解

1.  dynamicField 的做用是什麼? html

若是你須要在schema.xml文件中的<field> ......</field>部分定義多個<field>(math_score,chinese_score,english_score,....),而剛好這些<field>的type屬性又相同(type="integer"),那麼就能夠藉助 dynamicField 用一個句子完成 java

這樣,在一個document中,就可使用math_score,chinese_score,english_score 這些字段名,雖然在schema.xml文件中並未對它們進行一必定義。 web

dynamicField就是動態欄位, 要是你有太多欄位無法一一設定,你能夠用dynamicField處理像下面這第一個dynamicField就是說, 全部欄位是以 _i作結尾的 (如 a_i, sss_i, 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> apache

2. sortMissingLast 和  sortMissingFirst對<field>的屬性之一。只在對該<field>進行排序時,才起做用。 app

  • sortMissingLast = true時,那些在該<field>上沒有值的documents將被排在那些在該<field>上有值的documents以後。
  • sortMissingFirst = true時的狀況正好相反。
  • 若是二者都設爲false,則使用Lucene的排序。 

3. positionIncrementGap=100  只對 multiValue = true 的fieldType有意義。 webapp

http://svn.apache.org/repos/asf/lucene/solr/trunk/example/solr/conf/schema.xml svn

Suppose a document has a multi-valued "author" field.   Like this: 

author: John Doe 
author: Bob Smith 

With a position increment gap of 0, a phrase query of "doe bob" would   
be a match.  But often it is undesirable for that kind of match across   
different field values.  A position increment gap controls the virtual   
space between the last token of one field instance and the first token   
of the next instance.  With a gap of 100, this prevents phrase queries   
(even with a modest slop factor) from matching across instances. 

 4.    omitNorms this

什麼是Norm,如今還不懂????  spa

5. LowerCaseFilterFactory的做用。 設計

例如Kobe Bryant在分詞後 kobe 不能搜索到結果 Kobe能夠,雖然這個是中文分詞 法,但常常有中英混輸的狀況,若是在輸入英文後,查不到結果,也是比較失望的, 另外我看了你的源代碼,建議在詞庫的引進上採用單例模式,在web應用上會比較好, 謝謝你的幫助,另外我看了solol的mmseg的接口比較不錯,你是否有意看看,另外再 次感謝你的solr分詞 
Comment 1 by chenlb2008Aug 16, 2009
英文小寫,好辦,用 <filter class="solr.LowerCaseFilterFactory"/> 就行,詳情請 看:http://blog.chenlb.com/2009/04/solr-chinese-segment-mmseg4j-use-demo.html solol 基本沒看,我只是怕看了會影響個人設計思路。 也準備實現 http://chenlb.javaeye.com/blog/439843 提到的一些功能。 多謝你的關注。但願繼續提出你的見解。 

如下內容是從網上找到的

Solr schema.xml 的介紹

Tuesday, 1. April 2008, 07:23:25

solr

原來我是打算將Solr wiki裡的介紹直接翻譯成中文, 後來寫一寫覺得, 翻譯的內容太複雜, 很難懂. 因此在這裡我就直接拿一個schema.xml範例來介紹好了. 但願能幫助你們瞭解schema.xml

<?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, name, 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就是動態欄位, 要是你有太多欄位無法一一設定,你能夠用dynamicField處理像下面這第一個dynamicField就是說, 全部欄位是以 _i作結尾的 (如 a_i, sss_i, 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介紹
相關文章
相關標籤/搜索