夜间模式暗黑模式
字体
阴影
滤镜
圆角
主题色
Centos8 Elasticserach7.x集群配置

一、服务器信息

集群是由3台服务器组成,具体信息如下:

服务器名称服务器IP
node1172.26.170.101
node2172.26.170.102
node3172.16.170.103

二、Elasticsearch集群配置

安装包下载

mkdir -p /data/elasticsearch   #创建存档es的目录
cd /data/elasticsearch
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.9.2-linux-x86_64.tar.gz   #下载elasticsearch安装包

解压文件

tar -xf elasticsearch-7.9.2-linux-x86_64.tar.gz  #解压文件
cd elasticsearch-7.9.2 #进去目录
mkdir data   #创建数据存放目录
mkdir logs   #创建日志存放目录

添加elasticsearch用户和用户组

groupadd es   #添加用户组
useradd -g es es   #添加用户并将用户分配到用户组中
chown -R es.es ./* #赋予所有文件es用户和es用户组的权限

修改elasticsearch配置(conf/elasticsearch.yml)

node.name、neiwork.host参数需要写当前节点的信息

vim conf/elasticsearch.yml
#将下述配置添加到elasticsearch.yml文件中
#集群名称(各个节点需要统一)
cluster.name: dig
#节点的名称,各个节点不能重复。  
node.name: node-1   
#存的是当前目录,也可以不写默认就是当前目录data目录下
path.data: /data/elasticsearch/elasticsearch-7.9.2/data  
#存到是当前目录,也可以不写默认就是当前目录logs目录下
path.logs:  /data/elasticsearch/elasticsearch-7.9.2/logs  
#写localhost只允许本地访问,写主机IP允许其他访问,如果遇到那个虚拟IP的话没有主机IP可以写0.0.0.0 
network.host: 172.26.170.101 
#Http协议端口
http.port: 9206
#Tcp协议端口,jar包,集群之间通过Tcp协议进行通信
transport.tcp.port: 9306
#集群列表,以及通信端口,默认为9300
discovery.seed_hosts: ["172.26.170.101:9306","172.26.170.102:9306","172.26.170.103:9306"]
#集群节点的名称
cluster.initial_master_nodes: ["node-1","node-2","node-3"]

elasticsearch运行内存修改

vim config/jvm.options
#修改以下内容
#运行内存不要超过32G详情可以看elasticsearch官网。
#https://www.elastic.co/guide/en/elasticsearch/reference/current/heap-size.html
-Xms16g
-Xmx16g

防火墙添加开放端口

#开启Http协议端口
firewall-cmd --zone=public --add-port=9206/tcp --permanent
#开启Tcp协议端口
firewall-cmd --zone=public --add-port=9306/tcp --permanent
#重启防火墙
firewall-cmd --reload

elasticsearch启动测试

#进行测试下看看启动是否有问题
#进去es用户(在2.0版本以后es禁止使用root用户启动)
su es
#前台启动es
bin/elasticsearch

报错:[1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]解决

vim /etc/security/limits.conf
#修改以下内容
* soft nofile 65535
* hard nofile 65535
* soft nofile 65535
* hard nofile 65535

vim /etc/sysctl.conf
#添加下述内容
vm.max_map_count=655360
#重新加载下配置
sysctl -p

在进行测试bin/elasticsearch 已经正常运行没有问题了。

elasticsearch启动

将es添加成服务,直接进行启动,详情可以参考上一篇博客。https://www.zsjweblog.com/2020/10/16/centos8%e5%b0%86elasticsearch%e5%81%9a%e6%88%90systemctl%e6%9c%8d%e5%8a%a1/

#设置为开机自启动
systemctl enable elasticsearch.service

#启动
systemctl start elasticsearch.service

#关闭
systemctl stop elasticsearch.service

#重启
systemctl restart elasticsearch.service

三、elasticsearch集群访问

一般使用kibana或者head访问,kibana会在x-path插件后面讲述。敬请期待

google浏览器中有elasticsearch-head插件,所以现在也没有必要安装head插件了。

打开head插件直接输入IP地址进行访问

四、IK分词器安装

(1)默认分词器

Elasticsearch默认分词器有以下几种形式:

  • fingerprint——去除大小写,将汉字单个分开、单词分开并去重。
  • keyword——不进行分词任何操作,直接原文返回。
  • pattern——正则匹配,默认为\W+,也可以根据参数自己定义正则表达式。
  • simple——针对任何非字母进行切割,去除大小写、去除空格、数字,非字符汉字的字符。
  • standard——默认分词器,如果没有指定,则默认为standard分词器。按照单字切分、单词切分、去除大小写。
  • stop——停用词过滤(the is a)、去除大小写、数字、特殊字符、以数字特殊字符进行切割。
  • whitespace——以空格字符进行切割。

fingerprint(去除大小写、汉字单字切割、单词切割、去重)

keyword(不进行任何操作原样返回)

pattern(需要定义正则表达式默认为\W+)

如何自定义正则表达式,先定义一个正则表达式,然后在analzer中配置就可以了

#定义一个名字为camel的正则分词器
PUT test
{
  "settings": {
    "analysis": {
      "analyzer": {
        "camel": {
          "type": "pattern",
          "pattern": "([^\\p{L}\\d]+)"   #过滤一些特殊字符
        }
      }
    }
  }
}

使用上面定义的名称为camel的正则分词器(可以发现分词以后的结果没有特殊字符了)

simple(根据非单词字符进行切割,去除汉字、字母以外的字符)

standard(默认分词器、按照单字切分、单词切分、去除大小写)

stop(去除停用词——the a is … 、去除大小写、去除数字、特殊字符、以数字特殊字符进行切割)

whitespace(以空格字符进行切割)

(2)IK分词器

从默认分词器的例子可以看对中文分词不太友好,无法将中文分词准确。可能分为单个字符,或者是不进行分词,这样大大影响搜索的结果,所以需要安装对中文分词比较友好的IK分词器。

IK分词器安装

#关闭elasticsearch,在elasticsearch各个节点中重复下列操作
#下面的ik版本和安装的es版本要完全一致,否则安装会出现一些错误。
bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.9.2/elasticsearch-analysis-ik-7.9.2.zip

如果你用root用户进行安装的,记得重新给plugins(IK分词器安装目录)文件赋予下es的权限,否则启动会出现问题。

#我当前是在elasticsearch目录中
chown -R es.es ./* 

安装IK完成后启动elasticsearch集群。

#集群中各个节点都执行
systemctl start elasticsearch.sericve

IK分词器的分词方式

  • ik_smart——最粗粒度切分(切分出尽可能少的词)。
  • ik_max_word——最细粒度切分(切分出尽可能多的词)。

ik_smart(最粗粒度切分)

POST _analyze
{
  "analyzer": "ik_smart",
  "text": [
    "The Apache Flink是一个框架和分布式处理引擎&,Flink用于在无边界和10086有边界数据流上进行有状态的计算。"
  ]
}

ik_max_word(最细粒度切分)

可以看出最粗粒度切分的时候,对切分的词不会再进行切分,而最细粒度切分会对切分以后的词会再次进行切分。

添加扩展词字典和停用词字典(本地词典)

安装IK分词器以后IK分词器的配置文件和分词、停用词字典都在config/analysis-ik/文件夹下。如果需要配置自己的词典或者停用词需要添加自己的停用词文件.dit文件,一行一个词语,使用换行符\n进行换行,并确认扩展词典为UTF8格式

例:我现在有一个需求希望分词分出《分布式处理》这新得词语,但是上述的分词都没有达到要求,这里我添加一个自己的扩展词文件。

#进入到ik分词器的配置文件中
cd config/analysis-ik/
#添加一个扩展词文件
vim my.dic
分布式处理
#扩展词文件配置到IK分词器中
vim 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>
        <!--用户可以在这里配置自己的扩展字典 如果有路径可以写对应路径,多个的话中间用;分割如 my1.dic;my2.dic-->
        <entry key="ext_dict">my.dic</entry>
         <!--用户可以在这里配置自己的扩展停止词字典-->
        <entry key="ext_stopwords"></entry>
        <!--用户可以在这里配置远程扩展字典 -->
        <!-- <entry key="remote_ext_dict">words_location</entry> -->
        <!--用户可以在这里配置远程扩展停止词字典-->
        <!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>

重启Elasticsearch集群,配置词典需要在每个节点都配置。重启完成后在测试一下:

POST _analyze
{
  "analyzer": "ik_max_word",
  "text": [
    "The Apache Flink是一个框架和分布式处理引擎&,Flink用于在无边界和10086有边界数据流上进行有状态的计算。"
  ]
}

无论是最粗粒度还是最细粒度都多了《分布式处理》这个词语,添加词典完成。

添加扩展词字典和停用词字典(远程词典)

添加远程词典就是你可以动态更新词典,Elasticsearch集群自动去更新词典,不需要在进行重启集群。可以进行动态更新,也不用在每个节点中都存放对应的词典库了。

配置nginx做远程词典(这里创建nginx就不做讲解了)

#添加一个nginx配置文件
vim ik.conf
server {
         listen 8092;  #端口 
         server_name 172.26.170.101;  #ip 
         charset utf-8;
         location / {
             root   /usr/share/nginx/html/ik;  #词典存放地址 
         }
}

添加一个词典文件

#进入到上述配置的ik远程词典的目录
cd /usr/share/nginx/html/ik
#创建一个目录
mkdir dic
cd dic
#添加一个远程词典
vim my.dic
分布式处理引擎

测试词典能否正常访问

#重启ngixn
systemctl restart nginx.service
#测试下是否可以获取到
curl -sL 172.26.170.101:8092/dic/my.dic  

将远程词典添加到elasticsearch集群中(每个节点都需要添加)

#进入到elasticsearch目录
cd /data/elasticsearch
#编辑ik配置文件添加远程词典
vim config/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">my.dic</entry>
         <!--用户可以在这里配置自己的扩展停止词字典-->
        <entry key="ext_stopwords"></entry>
        <!--用户可以在这里配置远程扩展字典,多个使用;分割 -->
        <entry key="remote_ext_dict">172.26.170.101:8092/dic/my.dic</entry> 
        <!--用户可以在这里配置远程扩展停止词字典-->
        <!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>

各个节点全部添加完成后重启Elasticsearch集群

测试分词效果

这里需要注意用ik_smart因为是最粗粒度,不会将分词后的词在进行分解,所以不会分词出来前面添加的分布式处理。(分布式处理引擎包含了分布式处理)

ik_max_word最细粒度,将添加的词典都进行分词。

添加新词动态更新

#添加一个新词——有边界数据流
vim /usr/share/nginx/html/ik/dic/my.dic
分布式处理引擎
有边界数据流
词语添加正常获取
查看elasticsearch节点的日志发现新添加的词语已经自动更新完成

测试出ik_smart和ik_max_word都有新添加的词语,Elasticsearch集群也没有重启,动态添加完成。

更新词典以后,对入库的数据需要进行更新才能对新的词典进行分词

POST index_name/_update_by_query?scroll_size=100
暂无评论

发送评论 编辑评论


				
上一篇
下一篇