首页 > 技术文章 > ES优化 & 中文分词器

tcy1 2020-08-12 20:58 原文

一、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日志,确认新词被动态更新了
- 自己编写一个测试索引,插入测试数据,然后查看搜索结果
- 确认没有问题之后,在让开发插入新商品的数据
- 测试

推荐阅读