Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式的全文搜索引擎,其对外服务是基于RESTful web接口发布的。Elasticsearch是用Java开发的应用,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到近实时搜索,稳定,可靠,快速,安装使用方便。
Elasticsearch具备两个主要功能:
集群:Elasticsearch集群由一或多个节点组成,其中有一个主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的。Elasticsearch的一个概念就是去中心化,字面上理解就是无中心节点,这是对于集群外部来说的,因为从外部看Elasticsearch集群,在逻辑上是个整体,你与集群中的任何一个节点通信和与整个Elasticsearch集群通信是等价的。也就是说,主节点的存在不会产生单点安全隐患、并发访问瓶颈等问题。
索引:相当于关系型数据库中的表。其中存储若干相似结构的Document数据。如:客户索引,订单索引,商品索引等。Elasticsearch中的索引不像数据库表格一样有强制的数据结构约束,在理论上,可以存储任意结构的数据。但了为更好的为业务提供搜索数据支撑,还是要设计合适的索引体系来存储不同的数据。
Primary Shard:代表索引的主分片,Elasticsearch可以把一个完整的索引分成多个primary shard,这样的好处是可以把一个大的索引拆分成多个分片,分布存储在不同的Elasticsearch节点上,从而形成分布式存储,并为搜索访问提供分布式服务,提高并发处理能。primary shard的数量只能在索引创建时指定,并且索引创建后不能再更改primary shard数量。
Replica Shard:代表索引主分片的副本,Elasticsearch可以设置多个replica shard。replica shard的作用:一是提高系统的容错性,当某个节点某个primary shard损坏或丢失时可以从副本中恢复。二是提高Elasticsearch的查询效率,Elasticsearch会自动对搜索请求进行负载均衡,将并发的搜索请求发送给合适的节点,增强并发处理能力。
类型:每个索引中都必须有唯一的一个Type,Type是Index中的一个逻辑分类。Elasticsearch中的数据Document是存储在索引下的Type中的。
注意:Elasticsearch5.x及更低版本中,一个Index中可以有多个Type。Elasticsearch6.x版本之后,Type概念被弱化,一个Index中只能有唯一的一个Type。且在7.x版本之后,删除Type定义,每个index只有唯一固定命名为_doc的Type。
文档:Elasticsearch中的最小数据单元。一个Document就是一条数据,一般使用JSON数据结构表示。每个Index下的Type中都可以存储多个Document。一个Document中可定义多个field,field就是数据字段。如:学生数据({“name”:“张三”, “age”:20, “gender”:“男”})。
元数据:在Elasticsearch中所有以“_”开头的属性都成为元数据,都有着自己特定的含义。
例如:“_index”表示索引;“_type"表示类型;”_id“表示唯一主键;”_version“表示数据版本;”_source“表示源数据(即保存到Elasticsearch中的Document)等。
倒排索引:对数据进行分析,抽取出数据中的词条,以词条作为key,对应数据的存储位置作为value,实现索引的存储。这种索引称为倒排索引。倒排索引是Document写入Elasticsearch时分析维护的。如:
录入数据如下:
| 商品主键 | 商品名 | 商品描述 |
|---|---|---|
| 1 | 荣耀10 | 更贵的手机 |
| 2 | 荣耀8 | 相对便宜的手机 |
| 3 | IPHONE X | 要卖肾买的手机 |
分析结果后,维护的倒排索引如下:
| 词条 | 数据指针 |
|---|---|
| 手机 | 1,2,3 |
| 便宜 | 2 |
| 卖肾 | 3 |
| 相对 | 2 |
| 荣耀 | 1,2 |
| IPHONE | 32 |
使用的Elasticsearch的版本是7.6.2。Elasticsearch7.x要求Linux内核必须是4+版本以上。
在linux操作系统中,查看内核版本的命令是: uname -a 。
课堂使用的Linux是CentOS Stream 8。内核使用的是4.18。
如果没启动docker服务,则先启动docker服务。
systemctl start docker
也可以设置docker服务为开机自启。
systemctl enable docker
docker pull elasticsearch:7.6.2
docker run --name elasticsearch -d -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
-d : 代表后台启动。
-p : 用于绑定端口。其中9200是Elasticsearch提供restful(基于HTTP协议)服务的端口;9300是提供Transport(基于TCP协议)服务的端口。
discovery.type=single-node : 集群发现模式,单节点集群模式
docker logs -f elasticsearch
当日志中有”started“已启动状态信息时,代表容器启动成功 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GKA5bWVT-1663288606231)(images/es6.png)]
使用下述命令,测试Elasticsearch服务。
curl http://localhost:9200
显示如下信息,代表服务可用。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1shRAbdM-1663288606232)(images/es7.png)]
在课程中,Kibana作为学习时的工作平台使用。安装的Kibana版本必须和Elasticsearch版本一致。
docker pull kibana:7.6.2
docker run -d --name kibana --link elasticsearch:elasticsearch -p 5601:5601 kibana:7.6.2
--link elasticsearch:elasticsearch 中第一个elasticsearch是容器名,第二个elasticsearch是容器别名。设置link后才能让容器互通。
访问 http://Linux系统IP:5601
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OHkhmxzu-1663288606234)(images/es8.png)]](https://1000bd.com/contentImg/2023/11/06/175133325.png)

在控制台中输入的命令前缀,并不是命令本身,其代表的是使用哪种请求方式访问Elasticsearch提供的Restful服务。如: GET就代表使用GET请求访问Ealstcissearch。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hb1PMpZS-1663288606237)(images/es10.png)]](https://1000bd.com/contentImg/2023/11/06/175133311.png)
命令:其中v代表参数,表示返回的结果包含标题头。
GET /_cat/health?v
结果含义如下:
| 含义 | 表头 | 数据 |
|---|---|---|
| 编号 | epoch | 1640140938 |
| 时间戳 | timestamp | 02:42:18 |
| 集群名称 | cluster | docker-cluster |
| 健康状态 | status | green |
| 节点总数 | node.total | 1 |
| 数据节点数 | node.data | 1 |
| 总分片数 | shards | 5 |
| 主分片数量 | pri | 5 |
| 备份分片数量 | relo | 0 |
| 正在初始化的分片 | init | 0 |
| 未分配的分片 | unassign | 0 |
| 正在等待执行的任务 | pending_tasks | 0 |
| 挂起任务的等待时间 | max_task_wait_time | - |
| 活动的分片的占有百分比 | active_shards_percent | 100.0% |
status值包括:green、yellow、red
命令:其中v代表参数,表示返回的结果包含标题头。
GET /_cat/nodes?v
结果含义如下:
| 含义 | 表头 | 数据 |
|---|---|---|
| ES主机地址 | ip | 172.17.0.5 |
| 堆占用率 | heap.percent | 13 |
| 内存占用率 | ram.percent | 96 |
| CPU占用率 | cpu | 2 |
| 每分钟平均运行命令 | load_1m | 0.4 |