乐趣区

ElasticSearch重要概念及简单用法

接着上一篇 ElasticSearch 搭建的环境继续学习,从概念开始,本篇文章将介绍 ElasticSearch 中的一些重要概念及部分原理性概念,以下内容中简称为 ES。
一、ES 部分名词解释
1.NRT:英文全称为 Near RrealTime。中文意思为近实时,从写入数据到可以被搜索到之间有一个小于 1s 的延迟,使用 ES 进行搜索和数据分析可以达到秒级的速度。
注:由于 ES 写入数据到可以被索引到之间有延迟,所以对于业务中包含有保存幂等性需求时,需要注意;
在写完之后手动执行刷新操作,然后再查询,否则会可能出现数据写重的情况。

2.cluster:表示由多个节点组成的 ES 集群(常见集群种类:HA,HB,HP,具体可自行查阅资料)。集群有一个名称,默认是 elasticsearch,可以在配置文件中通过 cluster.name 字段手动指定,集群最小节点数可以为 1 个。
3.node:集群中的节点。节点也有自己的名称,默认是随机分配的,默认情况下,节点启动之后,会自动去寻找名称为 cluster.name 字段所指定的集群。如果在默认不修改 cluster.name 的情况下,启动多个节点之后,它们会自动组成一个 ES 集群。
4.document:文档。它是 ES 中的最小数据单元,通常使用 JSON 数据结构表示,每个 index(索引) 的 type(类型) 中,都可以存储多个 Document。
5.field:表示字段,具体指的是 Document 中的某一个数据字段。比如学生信息文档中的学号字段。
6.index:索引。是多个有相似结构的文档数据的集合,类似于 MySQL 数据库中的数据库概念。
7.type:类型。表示某个索引下面的某种相同数据结构的结合。在较低版本的 ES 中,一个索引中可以有多个 type,高版本中一个索引下只能有一个类型,官方建议每个索引下最好只有一个 type。如果一个 index 下有多个 type,在不同的搜索场景下可能会相互有影响,比如:一个索引下面有一个用于统计分析的 type 和一个用于搜索的 type,如果统计请求比较慢,有可能会阻塞到查询请求。
8.shard:每个 index 会被拆分为多个 shard,每个 shard 就会存放这个 index 的一部分数据,这此 shard 会散落在多台服务器上。有了 shard 就可以进行横向扩展,存储更多数据,让搜索和分析等操作分布到多台服务器上去执行,提升吞吐量和性能。shard 又分为 replica shard 和 primary shard,每个 shard 都是一个 lucene index.
9.replica:每个服务器随时可能故障或宕机,此时 shard 就可以会丢失,因此可以为每一个 shard 创建多个 replica 副本。replica 可以在 shard 故障时提供备用服务。保证数据不丢失或者丢失很少,多个 replica 还可以提升搜索操作的吞吐量和性能。
注意:
primary shard:建立索引时一次设置,不能修改,默认 5 个;
replica shard:可随时修改,默认 1 个),默认每个索引 10 个 shard,5 个 primary shard, 5 个 replica shard, 最小的高可用配置,是 2 台服务器。

二、ES 的文档数据格式的优点
1. 可以提供复杂的面向对象的数据结构;2. 如果不适用 ES,使用传统的关系型数据库,复杂的对象只能拍平,放到多个关联表中,查询的时候需要查询多个表,而且还得重新组合成复杂对象,特别麻烦;3. 基于 ES 面向文档的特性,而且提供了倒排索引,所以可以胜任复杂的查询和检索需求;4. 使用传统,流行的文档对象来存储,很容易处理;
三、ES 集群简单管理
1. 集群健康状态使用_cat 相关 api 查看,如下:
[root@es-master ~]# curl http://localhost:9200/_cat/health?pretty
#返回结果
1549092107 02:21:47 elasticsearch green 3 3 134 67 0 0 0 0 – 100.0%
可以看出,如果集群中的所有节点都正常启动,整个集群的状态为 green;
2. 集群的三种状态
(1)红 (red):不是所有的 primary shard 都是 active 状态的,部分索引有数据丢失了;
(2)黄 (yellow):每个索引的 primary shard 都是 active 状态的,但是部分 replica shard 不是 active 状态,处于不可用的状态,此时可以继续使用;
(3)绿 (green):每个索引的 primary shard 和 replica shard 都是 active 状态的;

集群启动时状态变化过程:
集群启动的时候,首先会有某些节点先启动,这些节点会被作为主节点,在所有的主节点未完全启动之前,集群此时处于 red 状态;
当主节点全部启动之后,集群状态会变为 yellow 状态;
所有的 replica 节点都启动完成之后,集群中的所有节点都已经齐全,此时集群变为 green 状态;

3._cat 中的重要 api
查看集群中的节点数
[root@es-master ~]# curl http://localhost:9200/_cat/nodes?pretty
192.168.199.12 29 95 12 0.00 0.08 0.06 mdi * es-node2
192.168.199.11 41 88 25 0.64 0.75 0.57 mdi – es-node1
192.168.199.11 20 88 25 0.64 0.75 0.57 mdi – es-node3
表示集群中有三个节点,es-node1,es-node2,es-node3;
查看集群中的分片数
[root@es-master ~]# curl http://localhost:9200/_cat/shards?pretty
student_index 3 p STARTED 1 4.3kb 192.168.199.11 es-node1
student_index 3 r STARTED 1 4.3kb 192.168.199.11 es-node3
student_index 2 p STARTED 2 8.5kb 192.168.199.12 es-node2
student_index 2 r STARTED 2 8.5kb 192.168.199.11 es-node3
student_index 1 r STARTED 1 4.4kb 192.168.199.11 es-node1
student_index 1 p STARTED 1 4.4kb 192.168.199.12 es-node2
student_index 4 p STARTED 1 4.4kb 192.168.199.11 es-node1
student_index 4 r STARTED 1 4.4kb 192.168.199.11 es-node3
student_index 0 p STARTED 0 261b 192.168.199.12 es-node2
student_index 0 r STARTED 0 261b 192.168.199.11 es-node3
表示 student_index 索引默认有 10 个分片,5 个 primary 和 5 个 replica;
查看集群中的索引列表
[root@es-master ~]# curl http://localhost:9200/_cat/indices?v
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
green open .monitoring-es-6-2019.01.27 kXMATwLHShGoGrAhOVPZqg 1 1 39439 432 48.3mb 24.1mb
green open .monitoring-kibana-6-2019.01.27 PpgWm9PSRXKU385_pQis2g 1 1 1512 0 1mb 531.7kb
green open .elastichq 19vJX4__TcunPjMCfybmdA 5 1 1 0 14kb 7kb
green open student_index 8VHSS7wyQIadWBcNWJsGPQ 5 1 5 0 43.9kb 21.9kb
green open student VXHrKYNcSRKELb7WSzToCw 5 1 2 0 23.8kb 11.9kb
默认展示的是系统索引和自己创建的索引,参数 v 表示查看详细信息;
_cat 还有其他 api,但是不是很常用,如果需要,可以通过如下命令查看即可
[root@es-master ~]# curl http://localhost:9200/_cat
=^.^=
/_cat/allocation
/_cat/shards
/_cat/nodes
/_cat/tasks

四、ES 简单操作
此处以电商系统商品搜索为例,使用 kibana 图形化操作界面,介绍 ES 的简单操作。1. 创建用法:
PUT /index_name/type_name/id
{}
例如:创建一个索引名称为 shop_index,类型为 productInfo,id 为 1 的索引
PUT /shop_index/productInfo/1
{
“name”: “HuaWei Mate8”,
“desc”: “Cheap and easy to use”,
“price”: 2500,
“producer”: “HuaWei Producer”,
“tags”: [
“Cheap”,
“Fast”
]
}
2. 查询用法:
GET /index_name/type_name/id

例如:查询 id 为 1 的商品信息
GET /shop_index/productInfo/1
{
“_index”: “shop_index”,
“_type”: “productInfo”,
“_id”: “1”,
“_version”: 1,
“found”: true,
“_source”: {
“name”: “HuaWei Mate8”,
“desc”: “Cheap and easy to use”,
“price”: 2500,
“producer”: “HuaWei Producer”,
“tags”: [
“Cheap”,
“Fast”
]
}
}
3. 修改
方法一:替换,通过 ID 替换,如果文档存在,则直接覆盖
用法:
PUT /index_name/type_name/id
{}

例如:将商品价格修改为 2400
PUT /shop_index/productInfo/1
{
“name”: “HuaWei Mate8”,
“desc”: “Cheap and easy to use”,
“price”: 2400,
“producer”: “HuaWei Producer”,
“tags”: [
“Cheap”,
“Fast”
]
}
注意:替换某个文档时,需要带着文档中的所有字段,否则未带着的字段会丢失,切记!!!
方法二:通过 ID 更新部分字段
用法:
POST /index_name/type_name/id/_update
{}

例如:将上述商品的价格改为 2200
POST /shop_index/productInfo/1/_update
{
“doc”: {
“price”: 2200
}
}
4. 删除用法:
DELETE /index_index/type_index/id

例如:删除 id 为 1 的商品记录:
DELETE /shop_index/productInfo/1

本篇文章简单介绍了 ES 的一些重要概念及基本用法,为后续内容做铺垫,下篇文章将继续 ES 的多种搜索方式!欢迎评论转发!

退出移动版