一. solr.TextField 允許用戶通過 分析器 來定製 索引和查詢 的 fieldType。
分析器包括 一個分詞器(tokenizer)和多個過濾器(filter)。
代碼展示:
<fieldType name="text" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class = "org.wltea.analyzer.solr.IKTokenizerFactory" isMaxWordLength="false" />
<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 = "org.wltea.analyzer.solr.IKTokenizerFactory" isMaxWordLength="true" />
<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>
二. Solr建立索引 和 對關鍵詞進行查詢 都得對字串進行分詞。
在向索引庫中添加全文檢索類型的索引的時候,Solr會首先用空格進行分詞,然後把分詞結果依次使用指定的過濾器進行過濾,最後剩下的結果纔會加入到索引庫中以備查詢。
分詞的順序如下:
索引
1:空格whitespaceTokenize
2:過濾詞StopFilter
3:拆字WordDelimiterFilter
4:小寫過濾LowerCaseFilter
5:英文相近詞EnglishPorterFilter
6:去除重複詞RemoveDuplicatesTokenFilter
查詢
1:查詢相近詞
2:過濾詞
3:拆字
4:小寫過濾
5:英文相近詞
6:去除重複詞
以上是針對英文,中文的除了空格,其他都類似。但具體是什麼樣子,需要看對應的 fieldType中的配置。
如 1. 中的配置
索引:
1. IK分詞
2. 停用詞過濾
3. 拆字
4. 小寫過濾
5. 關於不同語言的詞幹處理
查詢:
1. IK分詞
2. 同義詞
3. 停用詞
4. 拆字
5. 小寫過濾
6. 關於不同語言的詞幹處理
三. 常用分詞器與過濾器介紹
分詞器:
1. < tokenizer class =" solr.WhitespaceTokenizerFactory " />
空格分詞器
2. <tokenizer class = "org.wltea.analyzer.solr.IKTokenizerFactory" isMaxWordLength="false" />
IK分詞器
過濾器
1. <filter class ="solr.WordDelimiterFilterFactory" generateWordParts ="1" generateNumberParts ="1" catenateWords ="1" catenateNumbers ="1" catenateAll="0" splitOnCaseChange="1" />
在分詞和匹配時,考慮"-"連字符,字母數字的界限,非字母數字字符,這樣 "wifi"或"wi fi"都能匹配"Wi-Fi"。
2. <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true" />
同義詞,同義詞的構建一定要參考 http://ip:8983/solr/admin/analysis.jsp 頁面的分詞效果。
3. <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
在禁用字(stopword)刪除後,在短語間增加間隔
stopword:即在建立索引過程中(建立索引和搜索)被忽略的詞,比如is this等常用詞。
在conf/stopwords.txt維護。
4. 其它 參見 http://damoqingquan.iteye.com/blog/231293