elasticsearch之ik分詞器和自定義詞庫實現

普信男孩阿洲發表於2024-06-13

ElasticSearch分詞器

所謂的分詞就是透過tokenizer(分詞器)將一個字串拆分為多個獨立的tokens(詞元-獨立的單詞),然後輸出為tokens流的過程。

例如"my name is HanMeiMei"這樣一個字串就會被預設的分詞器拆分為[my,name,is HanMeiMei].ElasticSearch中提供了很多預設的分詞器,我們可以來演示看看效果

但是在ElasticSearch中提供的分詞器對中文的分詞效果都不好。

所以這時我們就需要安裝特定的分詞器 IK,在https://github.com/medcl/elasticsearch-analysis-ik 下載對應的版本,然後解壓縮

因為第一次啟動docker容器的時候進行了資料卷的掛載

docker run -d \
--name es \
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
-e "discovery.type=single-node" \
-v es-data:/usr/share/elasticsearch/data \
-v es-plugins:/usr/share/elasticsearch/plugins \
--privileged \
--network es-net \
-p 9200:9200 \
-p 9300:9300 \
elasticsearch:7.12.1

所以直接將解壓縮後的包拖到

這個目錄下

最後重啟es容器

ik分詞演示

ik_smart分詞

# 透過ik分詞器來分詞
POST /_analyze
{
"analyzer": "ik_smart"
,"text": "我是中國人,我熱愛我的祖國"
}

ik_max_word

POST /_analyze
{
"analyzer": "ik_max_word"
,"text": "我是中國人,我熱愛我的祖國"
}

擴充詞庫和停用詞典

在我們使用過程中我們會發現,一些新興詞彙不會被新增到詞庫中,如:奧裡給。。。並且不是所有的詞作者在編寫分詞器時都會知道。還有一些不敏感詞彙如“的”,“了”都會被分詞,佔用了我們一部分記憶體,所以我們需要停用這些詞彙

具體操作如下:

開啟shell控制檯,找到對應的xml檔案,在裡面進行相應的修改

然後在config目錄下新建ext.dic

直接在裡面新增你想要的詞彙就行

stopword.dic在config資料夾裡面有,就不用新建了,直接開啟新增你想要遮蔽的詞彙就行

最後重啟一下服務

最後測試一下生效了沒

能看到確實有效,ok了老鐵。還有其他更多的內容去官網上看吧。拜拜了

相關文章