所有的语言分词,默认使用的都是“Standard Analyzer”,但是这些分词器针对于中文的分词,并不友好。为此需要安装中文的分词器。
下面以IK分词器为例:
下载分词器# 进入ElasticSearch容器下载(或者在外部关联文件进行下载) docker exec -it elasticsearch /bin/bash # 下载分词器 wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.4.2/elasticsearch-analysis-ik-7.4.2.zip # 解压分词器到ik目录中 unzip elasticsearch-analysis-ik-7.4.2.zip -d ik # 移动ik到plugins目录下 mv ik plugins/ # 赋予ik目录权限 chmod -R 777 plugins/ik # 重新启动es docker restart elasticsearchstandard
默认分词器,不指定就是它。
GET _analyze
{
"analyzer": "standard",
"text":"我是中国人"
}
{
"tokens" : [
{
"token" : "我",
"start_offset" : 0,
"end_offset" : 1,
"type" : "",
"position" : 0
},
{
"token" : "是",
"start_offset" : 1,
"end_offset" : 2,
"type" : "",
"position" : 1
},
{
"token" : "中",
"start_offset" : 2,
"end_offset" : 3,
"type" : "",
"position" : 2
},
{
"token" : "国",
"start_offset" : 3,
"end_offset" : 4,
"type" : "",
"position" : 3
},
{
"token" : "人",
"start_offset" : 4,
"end_offset" : 5,
"type" : "",
"position" : 4
}
]
}
ik_smart
会做最粗粒度的拆分,比如会将“中华人民共和国人民大会堂”拆分为中华人民共和国、人民大会堂。
GET _analyze
{
"analyzer": "ik_smart",
"text":"我是中国人"
}
{
"tokens" : [
{
"token" : "我",
"start_offset" : 0,
"end_offset" : 1,
"type" : "CN_CHAR",
"position" : 0
},
{
"token" : "是",
"start_offset" : 1,
"end_offset" : 2,
"type" : "CN_CHAR",
"position" : 1
},
{
"token" : "中国人",
"start_offset" : 2,
"end_offset" : 5,
"type" : "CN_WORD",
"position" : 2
}
]
}
ik_max_word
会将文本做最细粒度的拆分,比如会将“中华人民共和国人民大会堂”拆分为“中华人民共和国、中华人民、中华、华人、人民共和国、人民、共和国、大会堂、大会、会堂等词语。
GET _analyze
{
"analyzer": "ik_max_word",
"text":"我是中国人"
}
{
"tokens" : [
{
"token" : "我",
"start_offset" : 0,
"end_offset" : 1,
"type" : "CN_CHAR",
"position" : 0
},
{
"token" : "是",
"start_offset" : 1,
"end_offset" : 2,
"type" : "CN_CHAR",
"position" : 1
},
{
"token" : "中国人",
"start_offset" : 2,
"end_offset" : 5,
"type" : "CN_WORD",
"position" : 2
},
{
"token" : "中国",
"start_offset" : 2,
"end_offset" : 4,
"type" : "CN_WORD",
"position" : 3
},
{
"token" : "国人",
"start_offset" : 3,
"end_offset" : 5,
"type" : "CN_WORD",
"position" : 4
}
]
}
自定义词库
我想分词“乔碧萝殿下”,但是“乔碧萝”ik分词器词库可能没有。
所以这里我们要通过Nginx,它把当做一个静态服务器,把词库放到静态服务器上,es就可以读取到了。
安装Nginx
# 随便启动一个Nginx实例 为了获取它的配置 docker run -p80:80 --name nginx -d nginx:1.10 # 将nginx容器内的配置文件拷贝到/mydata下 docker container cp nginx:/etc/nginx /mydata cd mydata/ # 把拷贝下来的文件夹改名 mv nginx conf # 创建一个新的名为ngin的目录 mkdir nginx # 把拷贝的配置已经去 这样就和启动Nginx时的配置文件的路径一致了 mv conf nginx # 停止原来的容器 并删除掉 docker stop nginx docker rm nginx # 创建新的容器 挂载各种配置信息 docker run -p 80:80 --name nginx -v /mydata/nginx/html:/usr/share/nginx/html -v /mydata/nginx/logs:/var/log/nginx -v /mydata/nginx/conf/:/etc/nginx -d nginx:1.10 # 设置开机自动启动nginx docker update nginx --restart=always
把词库放到Nginx目录中
mkdir /mydata/nginx/html/es cd /mydata/nginx/html/es # 在词库里面 输入 “乔碧萝” echo "乔碧萝" > /mydata/nginx/html/fenci.txt
测试结果
GET _analyze
{
"analyzer": "ik_max_word",
"text":乔碧萝殿下"
}
{
"tokens" : [
{
"token" : "乔碧萝",
"start_offset" : 0,
"end_offset" : 3,
"type" : "CN_WORD",
"position" : 0
},
{
"token" : "殿下",
"start_offset" : 3,
"end_offset" : 5,
"type" : "CN_WORD",
"position" : 1
}
]
}



