Lucene筆記15-Lucene的分詞-通過TokenStream顯示分詞
阿新 • • 發佈:2018-11-04
一、展示分詞內容
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比作水流,為了獲取水流,我們需要向水流中放置一個碗,通過碗來獲取到水流,也就獲取到了資料,這一塊一定要理解透。