1. 程式人生 > >Lucene筆記15-Lucene的分詞-通過TokenStream顯示分詞

Lucene筆記15-Lucene的分詞-通過TokenStream顯示分詞

一、展示分詞內容

package com.wsy;

import org.apache.lucene.analysis.*;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.util.Version;

import java.io.IOException;
import java.io.StringReader;

public class AnalyzerUtils {
    public static void displayToken(String string, Analyzer analyzer) {
        try {
            // 通過分詞器獲取TokenStream
            TokenStream tokenStream = analyzer.tokenStream("content", new StringReader(string));
            // TokenStream是一種流,我們要獲取流中的東西,就需要一個“碗”,我們將CharTermAttribute比作這個“碗”
            // 當TokenStream遍歷的時候,這個“碗”也跟著走,我們把“碗”放到流中就是方便獲取流中的資料
            CharTermAttribute charTermAttribute = tokenStream.addAttribute(CharTermAttribute.class);
            while (tokenStream.incrementToken()) {
                System.out.print("[" + charTermAttribute + "]");
            }
            System.out.println();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        Analyzer analyzer1 = new StandardAnalyzer(Version.LUCENE_35);
        Analyzer analyzer2 = new StopAnalyzer(Version.LUCENE_35);
        Analyzer analyzer3 = new SimpleAnalyzer(Version.LUCENE_35);
        Analyzer analyzer4 = new WhitespaceAnalyzer(Version.LUCENE_35);
        String string1 = "I am from liaocheng, it is my hometown. My name is Wang Shaoyang.My QQ number is 872452093.";
        String string2 = "我來自山東聊城,我的名字是王劭陽。";
        AnalyzerUtils.displayToken(string1, analyzer1);
        AnalyzerUtils.displayToken(string1, analyzer2);
        AnalyzerUtils.displayToken(string1, analyzer3);
        AnalyzerUtils.displayToken(string1, analyzer4);
        AnalyzerUtils.displayToken(string2, analyzer1);
        AnalyzerUtils.displayToken(string2, analyzer2);
        AnalyzerUtils.displayToken(string2, analyzer3);
        AnalyzerUtils.displayToken(string2, analyzer4);
    }
}

通過這個例子,可以看到對於一個字串的分詞結果,使用不同的分詞器對於分詞的效果是不同的,所以實際開發的時候,要根據需要使用合適的分詞器才行。

二、總結

在displayToken()方法中,有一個非常重要的思想,就是向流中新增attribute,之後通過attribute來檢視流中的內容,這在Lucene中非常重要,這裡舉了一個很形象的例子,把TokenStream比作水流,為了獲取水流,我們需要向水流中放置一個碗,通過碗來獲取到水流,也就獲取到了資料,這一塊一定要理解透。