【lucene】 field->term的分析過程_搜尋引擎

來源:互聯網
上載者:User
1.簡述 分析(analysis),在lucene中指的是將域(Field)轉換成最基本的索引表示單元——項(Term)的過程。項的值稱為語彙單元(token)。 對於英文來說,這個過程曆經了提取單詞、去除標點、字母轉小寫、去除停用詞、詞幹還原等。 對應關係見圖1-1. term的分析過程_搜尋引擎">
圖1-1 field與term的對應關係圖示 2.Analyzer org.apache.lucene.analysis. Analyzer
抽象類別。 lucene內建有WhitespaceAnalyzer、SimpleAnalyzer、StopAnalyzer與StandardAnalyzer等分析器。 2.1 StandardAnalyzer簡介 org.apache.lucene.analysis.standard. StandardAnalyzer 這是lucene最複雜的核心分析器。它包含大量的邏輯操作來識別某些種類的語彙單元(token),比如公司名稱、email地址等。它的主要處理有:提取單詞、去除標點、字母轉小寫、去除停用詞。 StandardAnalyzer的createComponents()方法見下:
@Overrideprotected TokenStreamComponents createComponents(final String fieldName) {final StandardTokenizer src = new StandardTokenizer();src.setMaxTokenLength(maxTokenLength);TokenStream tok = new StandardFilter(src);tok = new LowerCaseFilter(tok);tok = new StopFilter(tok, stopwords);return new TokenStreamComponents(src, tok) {  @Override  protected void setReader(final Reader reader) {src.setMaxTokenLength(StandardAnalyzer.this.maxTokenLength);super.setReader(reader);  }};}
可以清晰的看到分析過程就是 reader->tokenizer->tokenfilter_0->...->tokenfilter_n->tokens. 2.2 指定分析器 在建立IndexWriter時,會指定預設的分析器。也可以在addDocument()與updateDocument()的時候單獨為某個文檔指定特殊的分析器。 2.3 索引與查詢兩個階段的分析器使用 QueryParser通過解析使用者輸入的lucene查詢文法來產生Query對象,為使用者帶來了方便。 2.4 相關方法 org.apache.lucene.analysis. Analyzer
抽象類別。分析器,用於從域(field)中構建語彙單元(tokenstream)。
TokenStream org.apache.lucene.analysis.Analyzer. tokenStream(String fieldName, String text)
它會調用createComponents()方法獲得 TokenStreamComponents執行個體,然後返回components.getTokenStream()結果。
TokenStream org.apache.lucene.analysis.Analyzer. tokenStream(String fieldName, Reader reader)
tokenStream()的重載方法。 TokenStreamComponents org.apache.lucene.analysis.Analyzer. createComponents(String fieldName)
建立這個analyzer的component。內部會set reader,set tokenizer,set 若干個tokenfilter。
2.4.1 TokenStreamComponents org.apache.lucene.analysis.Analyzer. TokenStreamComponents
內部靜態類。它封裝了一個tokenstream的外部組件。它提供了對tokenizer的訪問。 org.apache.lucene.analysis.Analyzer.TokenStreamComponents. TokenStreamComponents(Tokenizer source, TokenStream result) 建構函式。
TokenStream org.apache.lucene.analysis.Analyzer.TokenStreamComponents. getTokenStream()
此方法被Analyzer.tokenStream()方法調用。
2.5 自訂Analyzer 繼承Analyzer這個抽象類別,重寫createComponents方法即可。 TokenStreamComponents org.apache.lucene.analysis.Analyzer. createComponents(String fieldName)
抽象方法,要求子類重寫。 一個filter鏈中,不能隨意調整tokenFilter的順序。例如StopFilter對停用詞是區分大小寫,那麼將它置於LowerCaseFilter的前面與後面結果是不一樣的。
在指定filter順序時,還要考慮對程式效能的影響。例如我們要考慮這樣一個分析器,它既能移除停用詞,又能將同義字注入到語彙單元流中。此時,首先移除停用詞效果會高一點,避免不必要的計算。
2.6 測試Analyzer 在索引過程中,是看不到field在背後被怎樣分析的,我們可以在測試方法中直接new Analyzer對象來測試文本的分析效果。 樣本工程 : https://code.csdn.net/chuchus/lucenedemo/
3.TokenStream org.apache.lucene.analysis. TokenStream
抽象類別,具體的子類有Tokenizer與TokenFilter。
boolean org.apache.lucene.analysis.TokenStream. incrementToken()
移動遊標,得到下一個token,如果tokenstream消費完了返回false。類似JDBC的ResultSet.hasNext()。
void org.apache.lucene.analysis.TokenStream. reset()
在開始調用incrementToken()方法前要先調用此方法。
3.1 TokenNizer org.apache.lucene.analysis. Tokenizer
抽象類別。TokenStream的子類,輸入為reader對象。 void org.apache.lucene.analysis.Tokenizer. setReader(Reader input)
設定Tokenizer的reader。
3.2 TokenFilter org.apache.lucene.analysis. TokenFilter
抽象類別,TokenStream的子類,輸入為其他的tokenstream對象,可用於迭代鏈式過濾。常見的子類有LowerCaseFilter,StopFilter等。
org.apache.lucene.analysis.TokenFilter. TokenFilter(TokenStream input)
建構函式,由子類通過super()方式調用,傳入Tokenizer對象或tokenFilter對象。 org.apache.lucene.analysis.core. LowerCaseFilter
將token中的字母轉為小寫。
org.apache.lucene.analysis.core. StopFilter
移除停用詞。
org.apache.lucene.analysis.en. PorterStemFilter
基于波特演算法的詞幹過濾器。StandardAnalyzer沒有用它,但我們自己可以方便地寫一個Analyzer來用它。 3.3 TokenAttribute

TokenStream在得到token(語彙單元)的時候,並不會建立string來儲存token,而是通過維護token在stream中的位移位置來實現。 3.3.1 CharTermAttribute org.apache.lucene.analysis.tokenattributes. CharTermAttribute
介面。代表token的text屬性。
org.apache.lucene.analysis.tokenattributes. CharTermAttributeImpl
CharTermAttribute介面的實作類別。
String org.apache.lucene.analysis.tokenattributes.CharTermAttributeImpl. toString()
輸出代表token的text。
3.3.2 OffsetAttribute org.apache.lucene.analysis.tokenattributes. OffsetAttribute
介面。描述一個token在stream中的位移位置(起始字元與終止字元)。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.