ES优化 & 中文分词器
一、ES优化
1.限制内存
1.启动内存最大是32G
2.服务器一半的内存全都给ES
3.设置可以先给小一点,慢慢提高
4.内存不足时
1)让开发删除数据
2)加节点
3)提高配置
5.关闭swap空间
2.文件描述符
1.配置文件描述符
[root@db02 ~]# vim /etc/security/limits.conf
* soft memlock unlimited
* hard memlock unlimited
* soft nofile 131072
* hard nofile 131072
2.普通用户
[root@db02 ~]# vim /etc/security/limits.d/20-nproc.conf
* soft nproc 65535
root soft nproc unlimited
[root@db02 ~]# vim /etc/security/limits.d/90-nproc.conf
* soft nproc 65535
root soft nproc unlimited
3.语句优化
1.条件查询时,使用term查询,减少range的查询
2.建索引的时候,尽量使用命中率高的词
二、中文分词器 ik
0.引出
# 为什么有中文分词器
如下案例所示,在搜索“中国”时,会将一个整体拆分开进行搜索,变成“中”“国”,在搜索时并不是精确匹配,
会将很多不相关搜索全部显示,同理,在百度搜索栏中,如果搜索中国这个词汇,结果显示很多只包含了这个字,而不是词,会将很多没用信息一同展示,所以就有了中文分词器,将需要组合成一个词的句子,存储成一个整体,在搜索时直接精确匹配展示。
1.插入数据
POST /index/_doc/1
{"content":"美国留给伊拉克的是个烂摊子吗"}
POST /index/_doc/2
{"content":"公安部:各地校车将享最高路权"}
POST /index/_doc/3
{"content":"中韩渔警冲突调查:韩警平均每天扣1艘中国渔船"}
POST /index/_doc/4
{"content":"中国驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首"}
2.查询数据
POST /index/_search
{
"query" : { "match" : { "content" : "中国" }},
"highlight" : {
"pre_tags" : ["<tag1>", "<tag2>"],
"post_tags" : ["</tag1>", "</tag2>"],
"fields" : {
"content" : {}
}
}
}
#查看结果,会获取到带中字和国字的数据,我们查询的词被分开了,所以我们要使用ik中文分词器
3.配置中文分词器
0)注意:
1.集群内所有的机器需要全部安装插件
2.创建模版之前要先单独创建索引
1)创建模板方式
1)安装插件
# 1.配置中文分词器
cd /usr/share/elasticsearch
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.6.0/elasticsearch-analysis-ik-6.6.0.zip
2)创建索引与mapping
# 1.创建索引
PUT /news
# 2.创建模板
curl -XPOST http://localhost:9200/news/text/_mapping -H 'Content-Type:application/json' -d'
{
"properties": {
"content": {
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_smart"
}
}
}'
# 3.插入测试数据
POST /news/text/1
{"content":"美国留给伊拉克的是个烂摊子吗"}
POST /news/text/2
{"content":"公安部:各地校车将享最高路权"}
POST /news/text/3
{"content":"中韩渔警冲突调查:韩警平均每天扣1艘中国渔船"}
POST /news/text/4
{"content":"中国驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首"}
# 4.再次查询数据发现已经能识别中文了
POST /news/_search
{
"query" : { "match" : { "content" : "中国" }},
"highlight" : {
"pre_tags" : ["<tag1>", "<tag2>"],
"post_tags" : ["</tag1>", "</tag2>"],
"fields" : {
"content" : {}
}
}
}
# 注意:
ik_max_word: 会将文本做最细粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,
中华人民,中华,华人,人民共和国,人民,人,民,共和国,共和,和,国国,国歌”,会穷尽各种可能的组合;
ik_smart: 会做最粗粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,国歌”。
索引时,为了提供索引的覆盖范围,通常会采用ik_max_word分析器,会以最细粒度分词索引,搜索时为了提高搜索准确度,会采用ik_smart分析器,会以粗粒度分词
2)本地配置文件修改方式
1.创建字典
vi /etc/elasticsearch/analysis-ik/main.dic
2.把字典发送到集群内所有的机器
scp main.dic 10.0.0.52:/etc/elasticsearch/analysis-ik/
3.重启所有的ES节点!!!
systemctl restart elasticsearch
4.更新索引的数据
POST /news2/text/5
{"content":"昨天胖虎很嚣张,让二毛请他吃饭"}
5.搜索测试
POST /news2/_search
{
"query" : { "match" : { "content" : "胖虎" }},
"highlight" : {
"pre_tags" : ["<tag1>", "<tag2>"],
"post_tags" : ["</tag1>", "</tag2>"],
"fields" : {
"content" : {}
}
}
}
3)远程扩展字典
1.安装nginx
[root@db01 ~]# cat /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
yum makecache fast
yum -y install nginx
2.配置nginx
[root@db01 nginx]# cat /etc/nginx/conf.d/default.conf
server {
listen 80;
server_name localhost;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html/;
charset utf-8;
autoindex on;
autoindex_localtime on;
autoindex_exact_size off;
}
}
nginx -t
systemctl start nginx
3.写字典
[root@db01 nginx]# cat /usr/share/nginx/html/my.txt
我
中国
日本
打发
台湾
小日本
伊朗
时间
滚蛋
王总
4.配置es的中文分词器插件
vim /etc/elasticsearch/analysis-ik/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"></entry>
<!--用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords"></entry>
<!--用户可以在这里配置远程扩展字典 -->
<entry key="remote_ext_dict">http://10.0.0.51/my.txt</entry>
<!--用户可以在这里配置远程扩展停止词字典-->
<!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>
5.将修改好的IK配置文件复制到其他所有ES节点
scp /etc/elasticsearch/analysis-ik/IKAnalyzer.cfg.xml 10.0.0.53:/etc/elasticsearch/analysis-ik/
6.重启所有的ES节点
systemctl restart elasticsearch
7.查看日志里字典的词有没有加载出来
tail -f /var/log/elasticsearch/linux5.log
8.打开es日志,然后更新字典内容,查看日志里会不会自动加载
9.搜索测试验证结果
POST /news2/text/6
{"content":"昨天胖虎很嚣张,把班长打了一顿并让班长请他吃饭"}
POST /news2/_search
{
"query" : { "match" : { "content" : "班长" }},
"highlight" : {
"pre_tags" : ["<tag1>", "<tag2>"],
"post_tags" : ["</tag1>", "</tag2>"],
"fields" : {
"content" : {}
}
}
}
测试是否更新
echo "武汉" >> /usr/share/nginx/html/my.txt
10.电商上架新产品流程(先更新字典,在插入数据)
- 先把新上架的商品的关键词更新到词典里
- 查看ES日志,确认新词被动态更新了
- 自己编写一个测试索引,插入测试数据,然后查看搜索结果
- 确认没有问题之后,在让开发插入新商品的数据
- 测试