一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

一步一步跟我學(xué)習(xí)lucene(3)---lucene的analysis相關(guān)和自定義分詞器

 Bladexu的文庫(kù) 2018-01-10

analysis說(shuō)明

lucene ananlysis應(yīng)用場(chǎng)景

lucene提供了analysis用來(lái)將文本轉(zhuǎn)換到索引文件或提供給IndexSearcher查詢(xún)索引;

對(duì)于lucene而言,不管是索引還是檢索,都是針對(duì)于純文本輸入來(lái)講的;

通過(guò)lucene的強(qiáng)大類(lèi)庫(kù)我們可以訪問(wèn)各種格式的文檔,如HTML、XML、PDF、Word、TXT等,

我們需要傳遞給lucene的只是文件中的純文本內(nèi)容;

 lucene的詞語(yǔ)切分

lucene的索引和檢索前提是其對(duì)文本內(nèi)容的分析和詞組的切分;比如,文檔中有一句話叫“Hello World,Welcome to China”

我們想找到包含這段話的文檔,而用戶輸入的查詢(xún)條件又不盡詳細(xì)(可能只是hello)

這里我們就需要用到lucene索引該文檔的時(shí)候預(yù)先對(duì)文檔內(nèi)容進(jìn)行切分,將詞源和文本對(duì)應(yīng)起來(lái)。

有時(shí)候?qū)υ~語(yǔ)進(jìn)行簡(jiǎn)單切分還遠(yuǎn)遠(yuǎn)不夠,我們還需要對(duì)字符串進(jìn)行深度切分,lucene不僅能夠?qū)λ饕齼?nèi)容預(yù)處理還可以對(duì)請(qǐng)求參數(shù)進(jìn)行切分;

使用analyzer

lucene的索引使用如下:

[java] view plain copy
  1. package com.lucene.analysis;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.StringReader;  
  5.   
  6. import org.apache.lucene.analysis.Analyzer;  
  7. import org.apache.lucene.analysis.TokenStream;  
  8. import org.apache.lucene.analysis.standard.StandardAnalyzer;  
  9. import org.apache.lucene.analysis.tokenattributes.OffsetAttribute;  
  10. import org.junit.Test;  
  11.   
  12. public class AnalysisTest {  
  13.     @Test  
  14.     public void tokenTest() {  
  15.         Analyzer analyzer = new StandardAnalyzer(); // or any other analyzer  
  16.         TokenStream ts = null;  
  17.         try {  
  18.             ts = analyzer.tokenStream("myfield"new StringReader(  
  19.                     "some text goes here"));  
  20.             OffsetAttribute offsetAtt = ts.addAttribute(OffsetAttribute.class);  
  21.             ts.reset(); // Resets this stream to the beginning. (Required)  
  22.             while (ts.incrementToken()) {  
  23.                 // Use AttributeSource.reflectAsString(boolean)  
  24.                 // for token stream debugging.  
  25.                 System.out.println("token: " + ts.reflectAsString(true));  
  26.   
  27.                 System.out.println("token start offset: "  
  28.                         + offsetAtt.startOffset());  
  29.                 System.out.println("token end offset: "  
  30.                         + offsetAtt.endOffset());  
  31.             }  
  32.             ts.end();   
  33.         } catch (IOException e) {  
  34.             // TODO Auto-generated catch block  
  35.             e.printStackTrace();  
  36.         } finally {  
  37.             try {  
  38.                 ts.close();  
  39.             } catch (IOException e) {  
  40.                 // TODO Auto-generated catch block  
  41.                 e.printStackTrace();  
  42.             }  
  43.         }  
  44.     }  
  45.   
  46. }  


自定義Analyzer和實(shí)現(xiàn)自己的analysis模塊

1.要實(shí)現(xiàn)自己的analyzer,我們需要繼承Analyzer并重寫(xiě)其中的分詞模塊。

2.維護(hù)停止詞詞典

3.重寫(xiě)TokenStreamComponents方法,選擇合適的分詞方法,對(duì)詞語(yǔ)進(jìn)行過(guò)濾

示例代碼如下

[java] view plain copy
  1. package com.lucene.analysis.self;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import org.apache.lucene.analysis.Analyzer;  
  6. import org.apache.lucene.analysis.TokenStream;  
  7. import org.apache.lucene.analysis.Tokenizer;  
  8. import org.apache.lucene.analysis.core.LowerCaseTokenizer;  
  9. import org.apache.lucene.analysis.core.StopAnalyzer;  
  10. import org.apache.lucene.analysis.core.StopFilter;  
  11. import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;  
  12. import org.apache.lucene.analysis.util.CharArraySet;  
  13.   
  14. public class MyAnalyzer extends Analyzer {  
  15.     private CharArraySet stopWordSet;//停止詞詞典  
  16.       
  17.     public CharArraySet getStopWordSet() {  
  18.         return stopWordSet;  
  19.     }  
  20.   
  21.     public void setStopWordSet(CharArraySet stopWordSet) {  
  22.         this.stopWordSet = stopWordSet;  
  23.     }  
  24.   
  25.       
  26.     public MyAnalyzer() {  
  27.         super();  
  28.         this.stopWordSet = StopAnalyzer.ENGLISH_STOP_WORDS_SET;//可在此基礎(chǔ)上拓展停止詞  
  29.     }  
  30.       
  31.     /**擴(kuò)展停止詞 
  32.      * @param stops 
  33.      */  
  34.     public MyAnalyzer(String[] stops) {  
  35.         this();  
  36.         stopWordSet.addAll(StopFilter.makeStopSet(stops));  
  37.     }  
  38.   
  39.     @Override  
  40.     protected TokenStreamComponents createComponents(String fieldName) {  
  41.         //正則匹配分詞  
  42.         Tokenizer source = new LowerCaseTokenizer();  
  43.         return new TokenStreamComponents(source, new StopFilter(source, stopWordSet));  
  44.     }  
  45.     public static void main(String[] args) {  
  46.         Analyzer analyzer = new MyAnalyzer();  
  47.         String words = "A AN yuyu";  
  48.         TokenStream stream = null;  
  49.           
  50.         try {  
  51.             stream = analyzer.tokenStream("myfield", words);  
  52.             stream.reset();   
  53.             CharTermAttribute  offsetAtt = stream.addAttribute(CharTermAttribute.class);  
  54.             while (stream.incrementToken()) {  
  55.                 System.out.println(offsetAtt.toString());  
  56.             }  
  57.             stream.end();  
  58.         } catch (IOException e) {  
  59.             // TODO Auto-generated catch block  
  60.             e.printStackTrace();  
  61.         }finally{  
  62.             try {  
  63.                 stream.close();  
  64.             } catch (IOException e) {  
  65.                 // TODO Auto-generated catch block  
  66.                 e.printStackTrace();  
  67.             }  
  68.         }  
  69.     }  
  70. }  


運(yùn)行結(jié)果如下:

[html] view plain copy
  1. yuyu  

說(shuō)明該分詞器對(duì)a an 進(jìn)行了過(guò)濾,這些過(guò)濾的詞在stopWordSet中

 添加字長(zhǎng)過(guò)濾器

有時(shí)候我們需要對(duì)字符串中的短字符進(jìn)行過(guò)濾,比如welcome to BeiJIng中過(guò)濾掉長(zhǎng)度小于2的字符串,我們期望的結(jié)果就變成了Welcome BeiJing,我們僅需要重新實(shí)現(xiàn)createComponents方法,相關(guān)代碼如下:

[java] view plain copy
  1. package com.lucene.analysis.self;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import org.apache.lucene.analysis.Analyzer;  
  6. import org.apache.lucene.analysis.TokenStream;  
  7. import org.apache.lucene.analysis.Tokenizer;  
  8. import org.apache.lucene.analysis.core.LowerCaseTokenizer;  
  9. import org.apache.lucene.analysis.core.StopAnalyzer;  
  10. import org.apache.lucene.analysis.core.StopFilter;  
  11. import org.apache.lucene.analysis.core.WhitespaceTokenizer;  
  12. import org.apache.lucene.analysis.miscellaneous.LengthFilter;  
  13. import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;  
  14. import org.apache.lucene.analysis.util.CharArraySet;  
  15.   
  16. public class LengFilterAanlyzer extends Analyzer {  
  17.     private int len;  
  18.       
  19.     public int getLen() {  
  20.         return len;  
  21.     }  
  22.   
  23.   
  24.     public void setLen(int len) {  
  25.         this.len = len;  
  26.     }  
  27.   
  28.   
  29.     public LengFilterAanlyzer() {  
  30.         super();  
  31.     }  
  32.       
  33.   
  34.     public LengFilterAanlyzer(int len) {  
  35.         super();  
  36.         this.len = len;  
  37.     }  
  38.   
  39.   
  40.     @Override  
  41.     protected TokenStreamComponents createComponents(String fieldName) {  
  42.         final Tokenizer source = new WhitespaceTokenizer();  
  43.         TokenStream result = new LengthFilter(source, len, Integer.MAX_VALUE);  
  44.         return new TokenStreamComponents(source,result);  
  45.   
  46.     }  
  47.     public static void main(String[] args) {  
  48.         Analyzer analyzer = new LengFilterAanlyzer(2);  
  49.         String words = "I am a java coder";  
  50.         TokenStream stream = null;  
  51.           
  52.         try {  
  53.             stream = analyzer.tokenStream("myfield", words);  
  54.             stream.reset();   
  55.             CharTermAttribute  offsetAtt = stream.addAttribute(CharTermAttribute.class);  
  56.             while (stream.incrementToken()) {  
  57.                 System.out.println(offsetAtt.toString());  
  58.             }  
  59.             stream.end();  
  60.         } catch (IOException e) {  
  61.             // TODO Auto-generated catch block  
  62.             e.printStackTrace();  
  63.         }finally{  
  64.             try {  
  65.                 stream.close();  
  66.             } catch (IOException e) {  
  67.                 // TODO Auto-generated catch block  
  68.                 e.printStackTrace();  
  69.             }  
  70.         }  
  71.     }  
  72. }  

程序的執(zhí)行結(jié)果如下:

[html] view plain copy
  1. am  
  2. java  
  3. coder  

說(shuō)明小于2個(gè)字符的文本被過(guò)濾了。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多

    亚洲熟女国产熟女二区三区| 99福利一区二区视频| 欧美一级特黄特色大色大片| 精品一区二区三区免费看| 久久国产精品熟女一区二区三区| 欧美黑人黄色一区二区| 国产视频福利一区二区| 老司机精品一区二区三区| 亚洲一区二区精品国产av| 亚洲国产香蕉视频在线观看| 欧美日韩亚洲精品在线观看| 国产成人精品一区在线观看| 日本大学生精油按摩在线观看| 久久精品中文扫妇内射| 91福利视频日本免费看看| 久久精品福利在线观看| 国内精品伊人久久久av高清| 精品国产亚洲区久久露脸| 国产精品一区二区三区日韩av| 欧美国产日韩变态另类在线看| 亚洲欧美日本国产有色| 国产美女网红精品演绎| 九九热精彩视频在线免费| 欧美黑人在线精品极品| 色狠狠一区二区三区香蕉蜜桃| 亚洲一区二区欧美在线| 国产欧美日产中文一区| 国产成人午夜福利片片| 久久精品国产亚洲av麻豆尤物| 日韩欧美一区二区不卡视频| 欧美中文字幕一区在线| 欧美日韩国产一级91| 国产欧美高清精品一区| 国产精品福利一级久久| 日本妇女高清一区二区三区| 欧美成人免费夜夜黄啪啪| 激情爱爱一区二区三区| 亚洲国产性生活高潮免费视频 | 91亚洲精品亚洲国产| 丁香六月啪啪激情综合区| 伊人国产精选免费观看在线视频|