前面幾章筆者把Lucene基本入門的任督二脈給打通了,今後篇開始,就開始進行Lucene的進階開發了,那麼首先擺在咱們面前的第一個必需要解決的問題,就是關於中文分詞的問題,由於Lucene畢竟是國外的大牛們開發的,顯然會比較側重英文文章,不過還好,在Lucene的下載包裏同步了SmartCN的分詞器針對中文發行的,每一次Lucene有新的版本發行,這個包同時更新。
筆者比較推薦的中文分詞器是IK分詞器,在進入正式的講解以前,咱們首先對Lucene裏面內置的幾個分析器作個瞭解.
java
分析器類型 | 基本介紹 |
WhitespaceAnalyzer | 以空格做爲切詞標準,不對語彙單元進行其餘規範化處理 |
SimpleAnalyzer | 以非字母符來分割文本信息,並將語彙單元統一爲小寫形式,並去掉數字類型的字符 |
StopAnalyzer | 該分析器會去除一些常有a,the,an等等,也能夠自定義禁用詞 |
StandardAnalyzer | Lucene內置的標準分析器,會將語彙單元轉成小寫形式,並去除停用詞及標點符號 |
CJKAnalyzer | 能對中,日,韓語言進行分析的分詞器,對中文支持效果通常。 |
SmartChineseAnalyzer | 對中文支持稍好,但擴展性差 |
package com.ikforlucene; import java.io.StringReader; import org.apache.lucene.analysis.TokenStream; import org.apache.lucene.analysis.tokenattributes.CharTermAttribute; public class Test { public static void main(String[] args)throws Exception { //下面這個分詞器,是通過修改支持同義詞的分詞器 IKSynonymsAnalyzer analyzer=new IKSynonymsAnalyzer(); String text="三劫散仙是一個菜鳥"; TokenStream ts=analyzer.tokenStream("field", new StringReader(text)); CharTermAttribute term=ts.addAttribute(CharTermAttribute.class); ts.reset();//重置作準備 while(ts.incrementToken()){ System.out.println(term.toString()); } ts.end();// ts.close();//關閉流 } }
運行結果: web
三 劫 散 仙 是 一個 菜鳥
第二步,測試擴展詞庫,使三劫爲一個詞,散仙爲一個詞,須要在同義詞庫裏添加三劫,散仙(注意是按行讀取的),注意保存的格式爲UTF-8或無BOM格式便可 apache
添加擴展詞庫後運行結果以下:
ide
三劫 散仙 是 一個 菜鳥
第三步,測試禁用詞庫,咱們把菜鳥二個字給屏蔽掉,每行一個詞,保存格式同上. 性能
添加禁用詞庫後運行結果以下:
測試
三劫 散仙 是 一個
最後咱們再來測試下,同義詞部分,如今筆者把河南人,洛陽人做爲"一個"這個詞的同義詞,添加到同義詞庫中(筆者在這裏僅僅是作一個測試,真正生產環境中的同義詞確定是正式的),注意同義詞,也是按行讀取的,每行的同義詞之間使用逗號分割。spa
添加同義詞庫後運行結果以下:
code
三劫 散仙 是 一個 河南人 洛陽人
至此,使用IK在Lucene4.3中大部分功能都已測試經過,下面給出擴展同義詞部分的源碼,有興趣的道友們,能夠參照借鑑下。
orm
package com.ikforlucene; import java.io.IOException; import java.io.Reader; import java.util.HashMap; import java.util.Map; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.Tokenizer; import org.apache.lucene.analysis.synonym.SynonymFilterFactory; import org.apache.solr.core.SolrResourceLoader; import org.wltea.analyzer.lucene.IKTokenizer; /** * 能夠加載同義詞庫的Lucene * 專用IK分詞器 * * * */ public class IKSynonymsAnalyzer extends Analyzer { @Override protected TokenStreamComponents createComponents(String arg0, Reader arg1) { Tokenizer token=new IKTokenizer(arg1, true);//開啓智能切詞 Map<String, String> paramsMap=new HashMap<String, String>(); paramsMap.put("luceneMatchVersion", "LUCENE_43"); paramsMap.put("synonyms", "E:\\同義詞\\synonyms.txt"); SynonymFilterFactory factory=new SynonymFilterFactory(paramsMap); SolrResourceLoader loader= new SolrResourceLoader(""); try { factory.inform(loader); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return new TokenStreamComponents(token, factory.create(token)); } }
關於同義詞部分的使用,各位道友,能夠先去官網上下載源碼,而後將此同義詞擴展部分放進去便可,很是簡單方便。
xml