七、分詞器 7.1、分詞器介紹 瞭解分詞器的概念 分詞器(Analyzer)是將一段文本,按照一定邏輯,拆分成多個詞語的一種工具,如下所示 華為手機 > 華為、手、手機 ElasticSearch 內置分詞器有以下幾種 Standard Analyzer 預設分詞器,按詞/字切分,小寫處理 (英文) ...
七、分詞器
7.1、分詞器介紹
瞭解分詞器的概念
-
分詞器(Analyzer)是將一段文本,按照一定邏輯,拆分成多個詞語的一種工具,如下所示
- 華為手機 ---> 華為、手、手機
-
ElasticSearch 內置分詞器有以下幾種
- Standard Analyzer
- 預設分詞器,按詞/字切分,小寫處理 (英文)華 為 手 機
- Simple Analyzer
- 按照非字母切分(符號被過濾),小寫處理
- Stop Analyzer
- 小寫處理,停用詞過濾(the,a,is)
- Whitespace Analyzer
- 按照空格切分,不轉小寫
- Keyword Analyzer
- 不分詞,直接將輸入當作輸出
- Patter Analyzer
- 正則表達式,預設\W+(非字元分割) (中文會被去掉)
- Language
- 提供了30多種常見語言的分詞器
- Standard Analyzer
-
ES提供了一個介面給我們來驗證分詞效果,如下所示
-
# 分詞效果驗證 GET _analyze { "text": "我愛寫代碼", "analyzer": "standard" }
-
分詞效果如下所示
-
Elasticsearch內置分詞器對中文很不友好(偏好英文),處理方式為一個字一個詞
-
7.2、IK分詞器介紹及安裝
學會如何集成ik分詞器
7.2.1、IK分詞器介紹
- IKAnalyzer是一個開源的,基於java語言開發的輕量級的中文分詞工具包,是一個基於Maven構建的項目,具有60萬字/秒的高速處理能力,並且支持用戶詞典擴展定義。
- 下載地址:https://github.com/medcl/elasticsearch-analysis-ik/releases
- IKAnalyzer又稱庖丁解牛分詞器
- 分詞器的核心
- 1)詞庫
- 2)分詞演算法
ik_smart
:最小分詞法- 我是程式員 -> 我、是、程式員
ik_max_word
:最細分詞法- 我是程式員 -> 我、是、程式員、程式、員
7.2.2、IK分詞器安裝
-
1)下載好ik分詞器後,進入創建ES容器的時候掛載的plugins目錄
-
2)將ik分詞器添加到plugins裡面即可
-
3)重啟es容器
docker restart elasticsearch
- PS:如果發現重啟失敗,es啟動後又意外關閉,可以查看日誌,一般是下載的ik分詞器版本跟es不一致導致的;可以參考博客修改(或者進入到ik分詞器文件夾中修改plugin-descriptor.properties文件中的es版本號)
-
4)驗證ik分詞器是否安裝成功
-
GET _analyze { "text": "我是程式員", "analyzer": "ik_max_word" }
-
-
一般情況下,
ik_smart
演算法足夠使用了,ik_max_word
以最細粒度分詞,會分太多次,數據量過大
7.3、使用IK分詞器
7.3.1、沒有設置ik分詞器之前
-
目前person索引庫的name欄位位text類型,我們使用term查詢(不分詞查詢),發現並沒有結果
-
GET person/_search { "query": { "term": { "name": { "value": "翠花" } } } }
-
因為預設情況下,text類型使用standard分詞器進行分詞
-
7.3.2、重建索引並設置ik分詞器
-
1)這時需要刪除person索引庫,然後重新設置name的類型為text,且analyzer為ik_max_word
-
# 刪除person索引庫 DELETE person PUT person { "mappings": { "properties": { "name":{ "type": "text", "analyzer": "ik_max_word" }, "age":{ "type": "integer" } } } }
-
-
2)插入數據
-
POST person/_doc/1 { "name": "翠花", "age": 20, "sex": "女" }
-
-
3)再次查詢
-
GET person/_search { "query": { "term": { "name": { "value": "翠花" } } } }
-
這時候不分詞查詢就有結果了
-
7.3.3、擴展詞詞典
- 隨著互聯網的發展,"造詞運動"也越發的頻繁。出現了很多新的詞語,在原有的辭彙列表中並不存在。比如:"奧力給",或者我們自定義的詞等等
- 所以我們的辭彙也需要不斷的更新,IK分詞器提供了擴展辭彙的功能
- 使用步驟如下所示
1)打開IK分詞器config目錄
- 文件如下所示
- PS:如果之前沒有做目錄掛載的話,可以參考如下命令
docker cp elasticsearch:/usr/share/elasticsearch/plugins/analysis-ik/config/IKAnalyzer.cfg.xml /root
- PS:如果之前沒有做目錄掛載的話,可以參考如下命令
2)修改IKAnalyzer.cfg.xml配置文件
-
在IKAnalyzer.cfg.xml配置文件中添加如下內容
-
<?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">ext.dic</entry> </properties>
-
3)新建ext.dic文件
-
新建一個ext.dic文件,可以參考config目錄下複製一個配置文件進行修改,添加如下內容
-
奧里給 啊噢額
-
4)重啟elasticsearch
docker restart elasticsearch(容器名稱或id)
5)測試效果
-
GET /_analyze { "analyzer": "ik_max_word", "text": "奧里給,啊噢額" }
-
PS:如果發現沒能正常分詞,可以使用
cat ext.dic
查看輸出在終端的文字是否亂碼- 在更改文件的時候,編碼必須是UTF-8格式
-
PS:ik分詞器不能使用中英文混合!
7.3.4、停用詞詞典
- 在互聯網項目中,網路傳輸的速度很快,所以很多語言是不允許在網路上傳遞的,如:關於宗教、政治等敏感詞語,那麼我們在搜索的時候,也應該忽略當前辭彙
- IK分詞器也提供了強大的停用詞功能,讓我們在索引的時候,就直接忽略當前停用辭彙表中的內容
- 停用詞詞典使用步驟如下所示
1)修改IKAnalyzer.cfg.xml配置文件
-
<?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">ext.dic</entry> <!--用戶可以在這裡配置自己的擴展停止詞字典 *** 添加停用詞詞典--> <entry key="ext_stopwords">stop.dic</entry> </properties>
2)在stopword.dic添加停用詞
結業
3)重啟elasticsearch
docker restart elasticsearch(容器名稱或id)
- 查看日誌:
docker logs -f elasticsearch(容器名稱或id)
- 仔細看的話,可以在日誌中查看到以及成功載入stopword.dic配置文件
4)測試效果
-
GET /_analyze { "analyzer": "ik_max_word", "text": "2018屆電腦1班的結業率高達10%,奧里給!" }