ElasticSearch服务器的搭建与使用

1.ElasticSearch集群的搭建:

1.1克隆 docker-base: es

1.2设置虚拟机内存:右键点es虚拟机 — 设置 — 内存设置成2G

1.3设置ip:

#修改固定ip
./ip-static
ip: 192.168.64.181

#重新查看ip
ifconfig

1.4c导入镜像:

docker load -i es-img.gz

1.5重启docker系统服务:

systemctl restart docker

1.6设置一个系统的底层参数,重启服务器:

echo 'vm.max_map_count=262144' >>/etc/sysctl.conf

#重启服务器
shutdown -r now

1.7准备虚拟网络和挂载目录

# 创建虚拟网络
docker network create es-net

# node1 的挂载目录
mkdir -p -m 777 /var/lib/es/node1/plugins
mkdir -p -m 777 /var/lib/es/node1/data

# node2 的挂载目录
mkdir -p -m 777 /var/lib/es/node2/plugins
mkdir -p -m 777 /var/lib/es/node2/data

# node3 的挂载目录
mkdir -p -m 777 /var/lib/es/node3/plugins
mkdir -p -m 777 /var/lib/es/node3/data

1.8启动 Elasticsearch 集群(三个节点组成的集群–分别启动三个节点集群)

节点一:

  • node1
docker run -d \
  --name=node1 \
  --restart=always \
  --net es-net \
  -p 9200:9200 \
  -p 9300:9300 \
  -v /var/lib/es/node1/plugins:/usr/share/elasticsearch/plugins \
  -v /var/lib/es/node1/data:/usr/share/elasticsearch/data \
  -e node.name=node1 \
  -e node.master=true \
  -e network.host=node1 \
  -e discovery.seed_hosts=node1,node2,node3 \
  -e cluster.initial_master_nodes=node1 \
  -e cluster.name=es-cluster \
  -e "ES_JAVA_OPTS=-Xms256m -Xmx256m" \
  elasticsearch:7.9.3

节点二:

  • node2
docker run -d \
  --name=node2 \
  --restart=always \
  --net es-net \
  -p 9201:9200 \
  -p 9301:9300 \
  -v /var/lib/es/node2/plugins:/usr/share/elasticsearch/plugins \
  -v /var/lib/es/node2/data:/usr/share/elasticsearch/data \
  -e node.name=node2 \
  -e node.master=true \
  -e network.host=node2 \
  -e discovery.seed_hosts=node1,node2,node3 \
  -e cluster.initial_master_nodes=node1 \
  -e cluster.name=es-cluster \
  -e "ES_JAVA_OPTS=-Xms256m -Xmx256m" \
  elasticsearch:7.9.3

节点三:

  • node3
docker run -d \
  --name=node3 \
  --restart=always \
  --net es-net \
  -p 9202:9200 \
  -p 9302:9300 \
  -v /var/lib/es/node3/plugins:/usr/share/elasticsearch/plugins \
  -v /var/lib/es/node3/data:/usr/share/elasticsearch/data \
  -e node.name=node3 \
  -e node.master=true \
  -e network.host=node3 \
  -e discovery.seed_hosts=node1,node2,node3 \
  -e cluster.initial_master_nodes=node1 \
  -e cluster.name=es-cluster \
  -e "ES_JAVA_OPTS=-Xms256m -Xmx256m" \
  elasticsearch:7.9.3

1.9查看启动结果结果

http://192.168.64.181:9200

http://192.168.64.181:9200/_cat/nodes

10.启动ElasticSearch时的参数说明

--name    #es节点的名称
--net es-net   #指定es节点挂载的虚拟网络(三个es节点挂载到同一条虚拟网络)
-p 9200    #客户端与es服务之间通信的端口
-p 9300    #es服务节点之间相互通信的端口(服务器与服务)
 -v /var/lib/es/node3/plugins:/usr/share/elasticsearch/plugins \       #挂载到容器的路径
 -v /var/lib/es/node3/data:/usr/share/elasticsearch/data \            #挂载到容器的路径
 -e node.name=node3 \            #ES的环境变量--------节点名
  -e node.master=true \                #ES的环境变量-----是否可以选举为主节点
  -e network.host=node3 \                #ES的环境变量-----当前节点的地址
  -e discovery.seed_hosts=node1,node2,node3 \  #服务发现(没有注册中心,直接通过节点列表做服务发现),集群中其他节点的地址列表,通过地址列表发现其它节点
  -e cluster.initial_master_nodes=node1 \        #ES的环境变量-----候选的主节点地址列表
  -e cluster.name=es-cluster \                        #ES的环境变量------集群名
  -e "ES_JAVA_OPTS=-Xms256m -Xmx256m" \                #ES的环境变量---------java虚拟机参数

2.ElasticSearch的客户端工具

ES的集群搭建成功,需要安装es的客户端工具,连接ES集群

chrome浏览器插件:elasticsearch-head

2.1安装ElasticSearch-Head:

2.1.1在 elasticsearch-head 项目仓库中下载 chrome 浏览器插件

https://github.com/mobz/elasticsearch-head/raw/master/crx/es-head.crx

2.1.2将文件后缀改为 zip
2.1.3解压缩
2.1.4在 chrome 浏览器中选择“更多工具”–“扩展程序”
2.1.5在“扩展程序”中确认开启了“开发者模式”
2.1.6点击“加载已解压的扩展程序”
2.1.7选择前面解压的插件目录
2.1.8在浏览器中点击 elasticsearch-head 插件打开 head 界面,并连接 http://192.168.64.181:9200/

2.2 IK分词器(不是ElasticSearch自带的,需要另外安装)

ES的搜索—倒排索引:

倒排索引源于实际应用中需要根据属性的值来查找记录。这种索引表中的每一项都包括一个属性值和具有该属性值的各记录的地址。由于不是由记录来确定属性值,而是由属性值来确定记录的位置,因而称为倒排索引(inverted index)。带有倒排索引的文件我们称为倒排索引文件,简称倒排文件(inverted file)。

就是通过搜索关键词,得到所有包括这些关键词的文档

IK分词器安装(版本号必须与ElasticSearch的版本保持一致)

安装 ik 分词器:

1.从 ik 分词器项目仓库中下载 ik 分词器安装包,下载的版本需要与 Elasticsearch 版本匹配:

https://github.com/medcl/elasticsearch-analysis-ik

或者可以访问 gitee 镜像仓库:
https://gitee.com/mirrors/elasticsearch-analysis-ik

2.下载 elasticsearch-analysis-ik-7.9.3.zip 复制到 /root/ 目录下
3.在三个节点上安装 ik 分词器
#进入root目录
cd ~/

# 复制 ik 分词器到三个 es 容器
docker cp elasticsearch-analysis-ik-7.9.3.zip node1:/root/
docker cp elasticsearch-analysis-ik-7.9.3.zip node2:/root/
docker cp elasticsearch-analysis-ik-7.9.3.zip node3:/root/

# 在 node1 中安装 ik 分词器
docker exec -it node1 elasticsearch-plugin install file:///root/elasticsearch-analysis-ik-7.9.3.zip

# 在 node2 中安装 ik 分词器
docker exec -it node2 elasticsearch-plugin install file:///root/elasticsearch-analysis-ik-7.9.3.zip

# 在 node3 中安装 ik 分词器
docker exec -it node3 elasticsearch-plugin install file:///root/elasticsearch-analysis-ik-7.9.3.zip

# 重启三个 es 容器
docker restart node1 node2 node3
4.查看安装结果

在浏览器中访问 http://192.168.64.181:9200/_cat/plugins

5.如果IK词后期使用出现问题,插件不可用,可以卸载后重新安装
docker exec -it node1 elasticsearch-plugin remove analysis-ik

docker exec -it node2 elasticsearch-plugin remove analysis-ik

docker exec -it node3 elasticsearch-plugin remove analysis-ik

ik分词测试
ik分词器提供两种分词器: ik_max_word 和 ik_smart

ik_max_word: 会将文本做最细粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,中华人民,中华,华人,人民共和国,人民,人,民,共和国,共和,和,国国,国歌”,会穷尽各种可能的组合,适合 Term Query;

测试:

1.打开谷歌浏览器,打开ElasticSearch-Head插件
2.连接ElasticSearch集群,连接 http://192.168.64.181:9200/
3.点复合查询
4.向 http://192.168.64.181:9200/_analyze 路径提交 POST 请求,并在协议体中提交 Json 数据
    {
   
        "analyzer":"ik_smart",
          "text":"中华人民共和国国歌"
    }
5.查看分词结果

ik_smart: 会做最粗粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,国歌”,适合 Phrase 查询。
测试:

1.打开谷歌浏览器,打开ElasticSearch-Head插件
2.连接ElasticSearch集群,连接 http://192.168.64.181:9200/
3.点复合查询
4.向 http://192.168.64.181:9200/_analyze 路径提交 POST 请求,并在协议体中提交 Json 数据
    {
   
        "analyzer":"ik_smart",
          "text":"中华人民共和国国歌"
    }
5.查看分词结果

2.3 Kibana客户端

ElasticSearch-Head客户端操作ES集群输入没有提示,不方便,启Kibana客户端操作更加方便

1.启动Kibana容器

docker run \
-d \
--name kibana \
--net es-net \
-p 5601:5601 \
-e ELASTICSEARCH_HOSTS='["http://node1:9200","http://node2:9200","http://node3:9200"]' \
--restart=always \
kibana:7.9.3

2.启动后,浏览器访问 Kibana,进入 Dev Tools:
http://192.168.64.181:5601/

3.ElasticSearch的索引,分片和副本(分布式搜索引擎)

  • 索引

Elasticsearch索引用来存储我们要搜索的数据,以倒排索引结构进行存储。

当索引中存储了大量数据时,大量的磁盘io操作会降低整体搜索新能,这时需要对数据进行分片存储。

  • 索引分片

在一个索引中存储大量数据会造成性能下降,这时可以对数据进行分片存储。

每个节点上都创建一个索引分片,把数据分散存放到多个节点的索引分片上,减少每个分片的数据量来提高io性能

每个分片都是一个独立的索引,数据分散存放在多个分片中,也就是说,每个分片中存储的都是不同的数据。搜索时会同时搜索多个分片,并将搜索结果进行汇总。
如果一个节点宕机分片不可用,则会造成部分数据无法搜索,为了解决这一问题,可以对分片创建多个副本来解决。

  • 副本
    对分片创建多个副本,那么即使一个节点宕机,其他节点中的副本分片还可以继续工作,不会造成数据不可用
分片的工作机制:
主分片的数据会复制到副本分片
搜索时,以负载均衡的方式工作,提高处理能力
主分片宕机时,其中一个副本分片会自动提升为主分片

3.1创建索引

创建一个名为 products 的索引,用来存储商品数据。

分片和副本参数说明:
number_of_shards:分片数量,默认值是 5
number_of_replicas:副本数量,默认值是 1
我们有三个节点,在每个节点上都创建一个分片。每个分片在另两个节点上各创建一个副本。

#创建索引:
#向es服务器提交PUT请求,请求地址:http://192.168.64.181:9200/products

PUT products
{
   
  "settings": {
   
    "number_of_shards": 3,
    "number_of_replicas": 2
  }
}

创建索引成功后,可以在ElasticSearch-Head上查看

用索引名称过滤,查看 products 索引

3.2映射(数据结构)

类似于数据库表结构,索引数据也被分为多个数据字段,并且需要设置数据类型和其他属性。
映射,是对索引中字段结构的定义和描述。

常用类型:
数字类型:
byte、short、integer、long
float、double
unsigned_long
字符串类型:
text : 会进行分词
keyword : 不会进行分词,适用于email、主机地址、邮编等
日期和时间类型:
date

创建映射
在 products 索引中创建映射。

分词器设置:
analyzer:在索引中添加文档时,text类型通过指定的分词器分词后,再插入倒排索引
search_analyzer:使用关键词检索时,使用指定的分词器对关键词进行分词
查询时,关键词优先使用 search_analyzer 设置的分词器,如果 search_analyzer 不存在则使用 analyzer 分词器。

#关键词优先使用 search_analyzer 设置的分词器,如果 search_analyzer 不存在则使用 analyzer 分词器。

"title": {
   
      "type": "text",
      "analyzer": "ik_max_word",           #存储文档时使用的分词器
      "search_analyzer": "ik_smart"     #对搜索内容分词,如果不设置就是用上面的analyzer
    },

创建products索引:

# 定义mapping,数据结构

PUT /products/_mapping
{
   
  "properties": {
   
    "id": {
   
      "type": "long"
    },
    "title": {
   
      "type": "text",
      "analyzer": "ik_max_word",
      "search_analyzer": "ik_smart"
    },
    "category": {
   
      "type": "text",
      "analyzer": "ik_smart",
      "search_analyzer": "ik_smart"
    },
    "price": {
   
      "type": "float"
    },
    "city": {
   
      "type": "text",
      "analyzer": "ik_smart",
      "search_analyzer": "ik_smart"
    },
    "barcode": {
   
      "type": "keyword"
    }
  }
}

查看映射

GET /products/_mapping

3.3ElasticSearch添加文档

# 添加文档 指定索引id
PUT /products/_doc/10033
{
   
  "id":"10033",
  "title":"SONOS PLAY:5(gen2) 新一代PLAY:5无线智能音响系统 WiFi音箱家庭,潮酷数码会场",
  "category":"潮酷数码会场",
  "price":"3980.01",
  "city":"上海",
  "barcode":"527848718459"
}


PUT /products/_doc/10034
{
   
  
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

guan_xfeng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值