Lucene教程--Analyzer分析器详解
Analyzer分析器
1?Analyzer使用時機
1.1?創建索引時使用Analyzer
輸入關鍵字進行搜索,當需要讓該關鍵字與文檔域內容所包含的詞進行匹配時需要對文檔域內容進行分析,需要經過Analyzer分析器處理生成語匯單元(Token)。分析器分析的對象是文檔中的Field域。當Field的屬性tokenized(是否分詞)為true時會對Field值進行分析,如下圖:
?
對于一些Field可以不用分析:
1、不作為查詢條件的內容,比如文件路徑
2、不是匹配內容中的詞而匹配Field的整體內容,比如訂單號、身份證號等。
1.2?搜索時使用Analyzer
對搜索關鍵字進行分析和索引分析一樣,使用Analyzer對搜索關鍵字進行分析、分詞處理,使用分析后每個詞語進行搜索。比如:搜索關鍵字:spring web ,經過分析器進行分詞,得出:spring??web拿詞去索引詞典表查找 ,找到索引鏈接到Document,解析Document內容。
對于匹配整體Field域的查詢可以在搜索時不分析,比如根據訂單號、身份證號查詢等。
注意:搜索使用的分析器要和索引使用的分析器一致。
2?Analyzer執行過程
2.1?代碼分析
Analyzer是一個抽象類,在Lucene的lucene-analyzers-common包中提供了很多分析器,比如:org.apache.lucene.analysis.standard.standardAnalyzer標準分詞器,它是Lucene的核心分詞器,它對分析文本進行分詞、大寫轉成小寫、去除停用詞、去除標點符號等操作過程。
什么是停用詞?停用詞是為節省存儲空間和提高搜索效率,搜索引擎在索引頁面或處理搜索請求時會自動忽略某些字或詞,這些字或詞即被稱為Stop Words(停用詞)。比如語氣助詞、副詞、介詞、連接詞等,通常自身并無明確的意義,只有將其放入一個完整的句子中才有一定作用,如常見的“的”、“在”、“是”、“啊”等。
如下是org.apache.lucene.analysis.standard.standardAnalyzer的部分源碼:
final StandardTokenizer src = new StandardTokenizer(getVersion(), reader);src.setMaxTokenLength(maxTokenLength);TokenStream tok = new StandardFilter(getVersion(), src);tok = new LowerCaseFilter(getVersion(), tok);//在標準分詞過濾器的基礎上加大小寫轉換過濾tok = new StopFilter(getVersion(), tok, stopwords);//在上邊過濾器基礎上加停用詞過濾如下圖是語匯單元的生成過程:
?
從一個Reader字符流開始,創建一個基于Reader的Tokenizer分詞器,經過三個TokenFilter生成語匯單元Token。
2.2?TokenStream
TokenStream是語匯單元流,tokenStream是一個抽象類,它是所有分析器的基類。如下圖:
?
Tokenizer是分詞器,負責將reader轉換為語匯單元即進行分詞,Lucene提供了很多的分詞器,也可以使用第三方的分詞,比如IKAnalyzer一個中文分詞器。
tokenFilter是分詞過濾器,負責對語匯單元進行過濾,tokenFilter可以是一個過濾器鏈兒,Lucene提供了很多的分詞器過濾器,比如大小寫轉換、去除停用詞等。
從TokenStream中獲取語匯單元信息,如下代碼:
//創建分析器Analyzer analyzer = new StandardAnalyzer();//得到TokenStreamTokenStream tokenStream = analyzer.tokenStream("content", new StringReader("Lucene is a Java full-text search engine"));//設置tokenStream初始狀態,否則會拋異常tokenStream.reset();//設置要獲取分詞的偏移量OffsetAttribute offsetAttribute = tokenStream.addAttribute(OffsetAttribute.class);//設置要獲取分詞的項CharTermAttribute charTermAttribute = tokenStream.addAttribute(CharTermAttribute.class);while(tokenStream.incrementToken()){System.out.println("-----------------");//起始偏移量System.out.print("-->"+offsetAttribute.startOffset());//截止偏移量System.out.print("-->"+offsetAttribute.endOffset());//分詞項的值System.out.println("-->"+new String(charTermAttribute.toString()));}3?中文分詞器
3.1?什么是中文分詞器
學過英文的都知道,英文是以單詞為單位的,單詞與單詞之間以空格或者逗號句號隔開。而中文則以字為單位,字又組成詞,字和詞再組成句子。所以對于英文,我們可以簡單以空格判斷某個字符串是否為一個單詞,比如I love China,love 和 China很容易被程序區分開來;但中文“我愛中國”就不一樣了,電腦不知道“中國”是一個詞語還是“愛中”是一個詞語。把中文的句子切分成有意義的詞,就是中文分詞,也稱切詞。我愛中國,分詞的結果是:我 愛 中國。
3.2?Lucene自帶中文分詞器
StandardAnalyzer:
單字分詞:就是按照中文一個字一個字地進行分詞。如:“我愛中國”,
效果:“我”、“愛”、“中”、“國”。
CJKAnalyzer
二分法分詞:按兩個字進行切分。如:“我是中國人”,效果:“我是”、“是中”、“中國”“國人”。
上邊兩個分詞器無法滿足需求。
SmartChineseAnalyzer
對中文支持稍好,但擴展性差,擴展詞庫,禁用詞庫和同義詞庫等不好處理
3.3?第三方產品介紹
ik-analyzer:
IK Analyzer是一個開源的,基于java語言開發的輕量級的中文分詞工具包。從2006年12月推出1.0版開始, IKAnalyzer已經推出了4個大版本。最初,它是以開源項目Luence為應用主體的,結合詞典分詞和文法分析算法的中文分詞組件。從3.0版本開始,IK發展為面向Java的公用分詞組件,獨立于Lucene項目,同時提供了對Lucene的默認優化實現。在2012版本中,IK實現了簡單的分詞歧義排除算法,標志著IK分詞器從單純的詞典分詞向模擬語義分詞衍化。
mmseg4j
用 Chih-Hao Tsai 的 MMSeg 算法(http://technology.chtsai.org/mmseg/)實現的中文分詞器,并實現 lucene 的 analyzer 和 solr 的TokenizerFactory 以方便在Lucene和Solr中使用。MMSeg 算法有兩種分詞方法:Simple和Complex,都是基于正向最大匹配。Complex 加了四個規則過濾。官方說:詞語的正確識別率達到了 98.41%。mmseg4j 已經實現了這兩種分詞算法。
imdict-chinese-analyzer
imdict-chinese-analyzer 是 imdict智能詞典 的智能中文分詞模塊,算法基于隱馬爾科夫模型(Hidden Markov Model, HMM),是中國科學院計算技術研究所的ictclas中文分詞程序的重新實現(基于Java),可以直接為lucene搜索引擎提供簡體中文分詞支持
庖丁解牛分詞
PaodingAnalzyer,最后版本是2.0.4,更新時間是2008-06-03,不支持Lucene3.0,目前已不再更新。
3.4?使用中文分詞器
IKAnalyzer繼承Lucene的Analyzer抽象類,使用IKAnalyzer和Lucene自帶的分析器方法一樣,將Analyzer測試代碼改為IKAnalyzer測試中文分詞效果。
?測試代碼如下:
//創建分析器Analyzer analyzer = new IKAnalyzer();//得到TokenStreamTokenStream tokenStream = analyzer.tokenStream("content", new StringReader("我是中國人,我愛sihai!"));3.5?自定義詞庫
在classpath下定義IKAnalyzer.cfg.xml文件,如下:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> <properties> <comment>IK Analyzer 擴展配置</comment><!-- 用戶可以在這里配置自己的擴展字典 --><entry key="ext_dict">dicdata/mydict.dic</entry> <!-- 用戶可以在這里配置自己的擴展停用詞字典 --><entry key="ext_stopwords">dicdata/ext_stopword.dic</entry> </properties>在classpath下的編輯dicdata/mydict.dic文件,此文件中存儲擴展詞庫,在dicdata/ext_stopword.dic文件中存放停用詞。
注意:mydict.dic和ext_stopword.dic文件的格式為UTF-8,注意是無BOM?的UTF-8?編碼。
總結
以上是生活随笔為你收集整理的Lucene教程--Analyzer分析器详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Lucene教程--入门程序详解
- 下一篇: Lucene教程--维护索引、查询对象和