1.分析器 所有分析器最終繼承的類都是Analyzer
1.1 默認標准分析器:StandardAnalyzer
在我們創建索引的時候,我們使用到了IndexWriterConfig對象,在我們創建索引的過程當中,會經歷分析文檔的步驟,就是分詞的步驟,默認采用的標准分析器自動分詞
1.1.1 查看分析器的分析效果
public static void main(String[] args) throws IOException { //1.創建一個Analyzer對象 StandardAnalyzer analyzer = new StandardAnalyzer(); //2.調用Analyzer對象的tokenStream方法獲取TokenStream對象,此對象包含了所有的分詞結果 TokenStream tokenStream = analyzer.tokenStream("", "安裝mysql-5.7.22-winx64后數據庫服務啟動報錯:本地計算機上的mysql服務啟動停止后,某些服務未由其他服務或程序使用時將自動停止而且mysql官網下載的壓縮包解壓出來沒有網線上安裝教... 博文 來自: 測試菜鳥在路上,呵呵"); //3.給tokenStream對象設置一個指針,指針在哪當前就在哪一個分詞上 CharTermAttribute charTermAttribute = tokenStream.addAttribute(CharTermAttribute.class); //4.調用tokenStream對象的reset方法,重置指針,不調用會報錯 tokenStream.reset(); //5.利用while循環,拿到分詞列表的結果 incrementToken方法返回值如果為false代表讀取完畢 true代表沒有讀取完畢 while (tokenStream.incrementToken()){ System.out.println(charTermAttribute.toString()); } //6.關閉 tokenStream.close(); }
分析會去掉停用詞,忽略大小寫,祛除標點
默認標准分析器分析英文沒有問題,但是他分析中文時會拆分成單個漢字,這顯然不符合實際需求
1.2 中文分析器
第三方中文分析器:IKAnalyzer
IKAnalyzer的使用步驟:
1.導入依賴
<!-- https://mvnrepository.com/artifact/com.jianggujin/IKAnalyzer-lucene --> <dependency> <groupId>com.jianggujin</groupId> <artifactId>IKAnalyzer-lucene</artifactId> <version>8.0.0</version> </dependency>
2.配置IKAnalyzer,導入配置文件
hotword.dic 擴展詞典,可以將時尚的網絡名詞放入到該詞典當中,這樣就能根據擴展詞典進行分詞
stopword.dic 停用詞詞典,可以將無意義的詞和敏感詞匯放入到該詞典當中,這樣在分析的時候就會忽略這些內容
<?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">hotword.dic;</entry> <!--用戶可以在這里配置自己的擴展停止詞字典 詞典可以有多個,每一個用;分割--> <entry key="ext_stopwords">stopword.dic;</entry> </properties>
在自定義擴展詞典和停用詞詞典的過程當中,千萬不要使用windows記事本編輯,因為windows記事本是UTF-8+BOM編碼
3.使用IKAnalyzer進行分詞
public static void main(String[] args) throws IOException { //1.創建一個Analyzer對象 Analyzer analyzer=new IKAnalyzer(); //2.調用Analyzer對象的tokenStream方法獲取TokenStream對象,此對象包含了所有的分詞結果 TokenStream tokenStream = analyzer.tokenStream("", "安裝mysql-5.7.22-winx64后數據庫服務啟動報錯:本地計算機上的mysql服務啟動停止后,某些服務未由其他服務或程序使用時將自動停止而且mysql官網下載的壓縮包解壓出來沒有網線上安裝教... 博文 來自: 測試菜鳥在路上,呵呵"); //3.給tokenStream對象設置一個指針,指針在哪當前就在哪一個分詞上 CharTermAttribute charTermAttribute = tokenStream.addAttribute(CharTermAttribute.class); //4.調用tokenStream對象的reset方法,重置指針,不調用會報錯 tokenStream.reset(); //5.利用while循環,拿到分詞列表的結果 incrementToken方法返回值如果為false代表讀取完畢 true代表沒有讀取完畢 while (tokenStream.incrementToken()){ System.out.println(charTermAttribute.toString()); } //6.關閉 tokenStream.close(); }
得到的就是常用的單詞了
4.程序當中使用IKAnalyzer
IndexWriter indexWriter=new IndexWriter(directory,new IndexWriterConfig(new IKAnalyzer()));