分词器:将一段文本,按照一定逻辑,拆分成多个词语的工具。
ElasticSearch内置分词器
注:ES内置分词器对中文分词不太友好,1个字1个词
- Standard Analyzer:默认分词器,按词切分,小写处理(全部转为小写)
- Simple Analyzer:按照非字母切分(符号被过滤),小写处理(全部转为小写)
- Stop Analyzer:小写处理,停用词过滤(the,a,is)
- Whitespace Analyzer:按照空格切分,不转小写
- Keyword Analyzer:不分词,直接将输入当做输出
- Patter Analyzer:正则表达式,默认\W+(非字符分割)
- Language:提供了30多种常见语言的分词器
IK分词器安装
IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包:
- 是一个基于Maven构建的项目
- 具有60万字/秒的高速处理能力
- 支持用户词典扩展定义
安装前提要有JDK,如果没有JDK,ES也有自带的JDK,指定一下环境变量:
vim /etc/profile
# 在profile文件末尾添加
#java environment
export JAVA_HOME=/opt/elasticsearch/jdk
export PATH=$PATH:${JAVA_HOME}/bin
# 保存退出后,重新加载profile
source /etc/profile
1.下载maven安装包并解压
下载:wget https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.8.1/binaries/apache-maven-3.8.1-bin.tar.gz
解压:tar -zxvf apache-maven-3.8.1-bin.tar.gz -C /opt/
改名:mv /opt/apache-maven-3.8.1/ /opt/apache-maven
2.设置maven环境变量
vim /etc/profile.d/maven.sh
# 内容复制到文件,保存
export MAVEN_HOME=/opt/apache-maven
export PATH=${MAVEN_HOME}/bin:${PATH}
# 生效环境变量
source /etc/profile.d/maven.sh
3.验证maven
mvn -v

4.解压IK分词器
# unzip使用-d指定解压目录
解压:unzip -d /opt/ elasticsearch-analysis-ik-7.4.0.zip
改名:mv /opt/elasticsearch-analysis-ik-7.4.0/ /opt/ik-analysis
5.编译jar包
# 进入到ik分词器目录执行:
mvn package
第一次使用mvn打包会下载一些东西,耐心等待......
6.jar包移动
package执行完毕后会在当前目录下生成target/releases目录,将其中的elasticsearch-analysis-ik-7.4.0.zip。拷贝到elasticsearch目录下的新建的目录plugins/analysis-ik,并解压
# 进入目录
cd /opt/elasticsearch/plugins
# 新建目录
mkdir analysis-ik
cd analysis-ik
# 执行拷贝
cp -R /opt/ik-analysis/target/releases/elasticsearch-analysis-ik-7.4.0.zip /opt/elasticsearch/plugins/analysis-ik
# 执行解压
unzip /opt/elasticsearch/plugins/analysis-ik/elasticsearch-analysis-ik-7.4.0.zip
# 拷贝辞典
cp -R /opt/ik-analysis/config/* /opt/elasticsearch/config/
注:一定要重启ES
使用IK分词器
IK分词器有两种分词模式:ik_max_word和ik_smart模式。
1、ik_max_word
会将文本做最细粒度的拆分,比如会将“乒乓球明年总冠军”拆分为“乒乓球、乒乓、球、明年、总冠军、冠军。

# 方式一ik_max_word
GET /_analyze
{
"analyzer": "ik_max_word",
"text": "乒乓球明年总冠军"
}
2、ik_smart会做最粗粒度的拆分,比如会将“乒乓球明年总冠军”拆分为乒乓球、明年、总冠军。

# 方式二ik_smart
GET /_analyze
{
"analyzer": "ik_smart",
"text": "乒乓球明年总冠军"
}
IK分词器-查询文档
- 词条查询:term。词条查询不会分析查询条件,只有当词条和查询字符串完全匹配时才匹配搜索
- 全文查询:match。全文查询会分析查询条件,先将查询条件进行分词,然后查询,求并集
修改ES默认分词器
# 删除之前的索引
DELETE person
# 创建索引,并制定分词器以及分词颗粒度
PUT person
{
"mappings": {
"properties": {
"name": {
"type": "keyword"
},
"address": {
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_smart"
}
}
}
}
添加测试数据
PUT person/_doc/id1
{
"name":"测试数据",
"address": "乒乓球明年总冠军"
}
PUT person/_doc/id2
{
"name":"测试数据2",
"address": "我爱北京天安门"
}
term词条查询

GET /person/_search
{
"query": {
"term": {
"address": {
"value": "北京"
}
}
}
}
若value为:北京天安门,则不会查到,因为term不会分词。
match全文查询

GET /person/_search
{
"query": {
"match": {
"address": "北京天安门"
}
}
}
match查询时不用写value,直接写字符串,会先分词,求交集查询。