分词器:
但默认的分词规则对中文处理并不友好。
在kibana的DevTools中测试:
POST /_analyze
{
"analyzer": "standard",
"text": "张三老铁学习java!"
}
post代表请求方式。
/_analyze代表分词分析。
analyzer分词类型,这里是默认的standard分词器。
text要分词的内容。
中文都直接被拆分成了一个个汉字,所以不能此分词器,要用lk分词器。
安装ik分词器
在线安装,不推荐较慢
# 进入容器内部
docker exec -it elasticsearch /bin/bash
# 在线下载并安装
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.12.1/elasticsearch-analysis-ik-7.12.1.zip
#退出
exit
#重启容器
docker restart elasticsearch
离线安装,推荐
# 查看elasticsearch的plugins目录位置
docker volume inspect es-plugins
/var/lib/docker/volumes/es-plugins/_data
上传离线包到此目录
然后重启
docker restart es
# 查看日志
docker logs -f es
回到kibana中测试
ik分词器包含两种模式:
ik_smart:最少切分,分词少,但占用内存低一些
ik_max_word:最细切分,分词多,但占用内存多
ik_smart
POST /_analyze
{
"analyzer": "ik_smart",
"text": "张三老铁学习java!"
}
返回
{
"tokens" : [
{
"token" : "张",
"start_offset" : 0,
"end_offset" : 1,
"type" : "CN_CHAR",
"position" : 0
},
{
"token" : "三老",
"start_offset" : 1,
"end_offset" : 3,
"type" : "CN_WORD",
"position" : 1
},
{
"token" : "铁",
"start_offset" : 3,
"end_offset" : 4,
"type" : "CN_CHAR",
"position" : 2
},
{
"token" : "学习",
"start_offset" : 4,
"end_offset" : 6,
"type" : "CN_WORD",
"position" : 3
},
{
"token" : "java",
"start_offset" : 6,
"end_offset" : 10,
"type" : "ENGLISH",
"position" : 4
}
]
}
ik_max_word
POST /_analyze
{
"analyzer": "ik_max_word",
"text": "张三老铁学习java!"
}
返回
{
"tokens" : [
{
"token" : "张三",
"start_offset" : 0,
"end_offset" : 2,
"type" : "CN_WORD",
"position" : 0
},
{
"token" : "三老",
"start_offset" : 1,
"end_offset" : 3,
"type" : "CN_WORD",
"position" : 1
},
{
"token" : "三",
"start_offset" : 1,
"end_offset" : 2,
"type" : "TYPE_CNUM",
"position" : 2
},
{
"token" : "老",
"start_offset" : 2,
"end_offset" : 3,
"type" : "CN_CHAR",
"position" : 3
},
{
"token" : "铁",
"start_offset" : 3,
"end_offset" : 4,
"type" : "CN_CHAR",
"position" : 4
},
{
"token" : "学习",
"start_offset" : 4,
"end_offset" : 6,
"type" : "CN_WORD",
"position" : 5
},
{
"token" : "java",
"start_offset" : 6,
"end_offset" : 10,
"type" : "ENGLISH",
"position" : 6
}
]
}
分词器原理
分词器有对应的字典,分词时匹配字典,如果有就分词。
对于字典中不存在的,想在使用,就需要个性化设置,也就是拓展。
拓展与停用
修改ik分词器目录中的config目录中的ikAnalyzer.cfg.xml文件:
IK Analyzer 扩展配置
ext.dic
stopword.dic
指定拓展与停止文件后,在当前目录下新建ext.dic与stopword.dic
ext.dic
老铁
stopword.doc
有现在的文件,不需要新建,直接追加
的
了
哦
啊
嗯
替换文件后,重启ES
docker restart es
再测试
POST /_analyze
{
"analyzer": "ik_smart",
"text": "张三的老铁学习java!"
}
返回中有【老铁】分词,【的】也去掉了
{
"tokens" : [
{
"token" : "张三",
"start_offset" : 0,
"end_offset" : 2,
"type" : "CN_WORD",
"position" : 0
},
{
"token" : "老铁",
"start_offset" : 3,
"end_offset" : 5,
"type" : "CN_WORD",
"position" : 1
},
{
"token" : "学习",
"start_offset" : 5,
"end_offset" : 7,
"type" : "CN_WORD",
"position" : 2
},
{
"token" : "java",
"start_offset" : 7,
"end_offset" : 11,
"type" : "ENGLISH",
"position" : 3
}
]
}