分詞器
在我們match查詢的時候,ElasticSearch會默認給我們創建通過分詞器創建倒排索引,ElasticSearch 默認分詞器是standard分詞器,我們來看看對英文的分詞效果
# 分詞查看語法
GET /_analyze
{
"analyzer": "分詞器",
"text": "分詞語句"
}
可以看到基本是以單詞作爲拆分,如果是中文呢。來看看效果
可以看到基本不會分詞,而我們大多數存的都是中文,如何添加中文分詞器呢
主流的就是 IK Analysis分詞器
ik分詞器分爲兩種:
- ik_max_word: 會將文本做最細粒度的拆分
比如會將“中華人民共和國國歌”拆分爲“中華人民共和國,中華人民,中華,華人,人民共和國,人民,人,民,共和國,共和,和,國國,國歌”,會窮盡各種可能的組合; - ik_smart: 會做最粗粒度的拆分
比如會將“中華人民共和國國歌”拆分爲“中華人民共和國,國歌”。
安裝 IK Analysis
github下載地址
https://github.com/medcl/elasticsearch-analysis-ik
下載與自己es想對應的版本分詞器即可
等待編譯完成後,在target/release目錄下會生產名爲elasticsearch-analysis-ik-7.4.0.zip的文件,如下所示:
然後將 elasticsearch-analysis-ik-6.5.0.zip 文件解壓
在 elasticsearch-7.7.1\plugins 中 創建 ik分詞器將這些文件copy過去
重啓 elasticsearch,失敗,報錯,查看日誌
ik編譯出來的版本不支持ElasticSearch 7.7.1,修改下IK的配置文件就好了
重啓 ElasticSearch
測試
es分詞大致安裝就是如此吧對
ik配置文件說明
- main.dic k原生內置的中文詞庫
- quantifier.dic 單位相關的詞
- surname.dic 中國的姓氏
自定義詞庫
我們重點看一下 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">custom/mydict.dic;custom/single_word_low_freq.dic</entry>
<!--用戶可以在這裏配置自己的擴展停止詞字典-->
<entry key="ext_stopwords">custom/ext_stopword.dic</entry>
<!--用戶可以在這裏配置遠程擴展字典 -->
<!-- <entry key="remote_ext_dict">words_location</entry> -->
<!--用戶可以在這裏配置遠程擴展停止詞字典-->
<!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>
配置分詞和停用詞後重啓 elasticsearch 生效
熱更新
- 修改ik分詞器源碼,然後手動支持從mysql中每隔一定時間,自動加載新的詞庫
- 基於ik分詞器原生支持的熱更新方案,部署一個web服務器,提供一個http接口,通過modified和tag兩個http響應頭,來提供詞語的熱更新
這裏自行百度不作演示
使用
創建索引mapping的時候指定分詞器
PUT /my_index
{
"mappings": {
"my_type": {
"properties": {
"text": {
"type": "text",
"analyzer": "ik_max_word"
}
}
}
}
}