基本概念一: 文档,索引,REST API
文档:
ElasticSearch 是面向文档的,文档是所有可搜索数据的最小单位。如cerebro中

比如: messages 日志中的一条日志,一张专辑里面的一首歌曲,这些在es中都是一个文档。
文档特性:
ElasticSearch 会把“文档”序列化成一个json格式数据,保存到es中。
- json 对象由“字段”组成;
- 每个字段又都有其数据类型(字符串/整形/布尔型/等);
- 每一个文档,都有一个UID, 这个uid可以手动指定,也可以自动生成;
- 需要注意字段是可以嵌套的;
例如:

文档元数据:
ES中的文档会有一个“元数据”,通过元数据来表示文档的一些属性信息。例如:

索引
索引可以看做是一类“文档”的集合,上面提到message日志中的一条日志是一个文档,那么整个message文件可以看做一个索引。同样的一张专辑是一个索引,里面的每一首歌曲则是一个个的文档。
- 每个索引都有自己的Mapping定义,用来定义包含的文档的字段名,和字段类型;
- 索引中的数据分散在shard上;
- 索引通过Mapping定义文档中的字段的类型结构;
- 索引通过setting 定义文档中的数据分布,就是关于shard的设置;
REST API

ElasticSearch 的rest api 用于其他语言与es交互使用

基本概念二:节点,集群,分片及副本
集群
ElasticSearch 作为一个分布式集群,具有其可用性和扩展性:
- 高可用性
- 服务可用性 - 允许有节点停止服务,不会影响整个集群的服务
- 数据可用性 - 部分节点数据丢失,集群不会丢失数据
- 可扩展性
- 请求量提升/数据的不断增长(将数据分布到所有节点)
- 实现存储的水平扩容
分布式架构:
- 不同的集群通过不同的名字来区分,名字可以自定义;
- 一个集群可以有一个或多个节点
节点
- 节点其实就是一个ElasticSearch 的实例
- 本质上是一个java 进程;
- 一台机器上可以运行多个ElasticSearch 进程,生产建议一台机器运行一个实例;
- 每一个节点可以设置名字,node.name 指定
- 每一个节点启动后,会分配一个UID,保存在data目录下,唯一。
节点类型:
关于Master-eligible nodes 和 Master Node
- 每一个节点启动,默认就是一个Master eligible 节点
- 可以设置 node.master: false 禁止
- Master-eligible 节点可以参加选举,称为Master 节点;
- 当第一个节点启动时候,会把自己选举为Master节点;
- 每个节点都保存了集群状态,只有Master节点可以修改集群信息;
- 集群状态 - Cluster State 维护一个集群中必要的信息,包括:
- 所有的节点信息;
- 所有的索引,及其Mapping 和 Setting信息
- 分片的路由信息
- 集群状态 - Cluster State 维护一个集群中必要的信息,包括:
- 如果任意节点都能修改信息,会导致数据的不一致
关于Data Node 与 Coordinating Node
- Data Node
- 数据存储节点,保存分片数据;
- 通过增加Data Node ,实现存储扩容;
- Coordinating Node
- 负责接收Client的请求,并将请求分发到合适的节点,最终把结果汇集到一起;
- 每个节点默认都起到了Coordinating Node的职责;
其他类型的节点:

每个节点在启动时,通过读取配置文件,来确认自己承担什么样的角色,配置参数如下:

分片 shard
分片分为两类:主分片 和 副本分片
- 主分片- Primary Shard
- 用以解决数据的水平扩展问题。通过主分片,可以将数据分布到集群内的所有节点上
- 一个分片是一个运行的Lucene 的实例;
- 主分片数在创建索引时指定,后续不能修改,除非Reindex;
- 用以解决数据的水平扩展问题。通过主分片,可以将数据分布到集群内的所有节点上
- 副本分片 - Replica Shared
- 用于解决数据高可用的问题,副本分片是主分片的拷贝;
- 副本分片数可以动态调整;
- 增加副本数,在一定程度上可以调高服务的读取吞吐量;
各节点中索引的分片分布情况:
以一个三节点的索引为例:
"blogs": { -
"settings": { -
"index": { -
"number_of_shards": "3",
"number_of_replicas": "1",
}
}
}
在索引blogs中创建了3个主分片,1个副本分片,看下cerebro中的展示:

假设有一个节点es01出现故障导致导致其上的 主分片 0 和 主分片 2 丢失,可以通过es02 上的副本分片0 和es03 上的副本分片2 恢复主分片数据,从而保证数据完整性。
分片的设定
生成环境中分片设定,需要提前做好容量规划:
- 分片数设置过小
- 导致后续无法增加节点实现水平扩展;
- 单个分片上的数据量会过大,导致数据重新分配耗时;
- 分片数设置过大
- 影响搜索结果的相关性打分,影响统计结果的准确性;
- 单个节点上过多的分片,会导致资源浪费,同时也会影响性能;
查看集群的健康状况:

ElasticSearch 有三种颜色表示集群的健康状况:
- Green 主分片和副本分配正常分配
- Yellow 主分片正常分配,有副本分片未能正常分配
- Red 有主分片未能正常分片
查看索引和分片

文档的CRUD与基本操作
文档读取:获取文档内容
Read:
// 获取movies索引中id为1的文档内容 GET movies/_doc/1

文档创建:
Index:如果文档不存在,则创建。如果存在,先删除现有文档,在创建新文档,版本加1
PUT blogs/_doc/1
{
"user": "Mike",
"comment": "you know"
}
创建成功:

查看这个创建的文档:
GET blogs/_doc/1

当前的version是1,如果在创建一次的话,按照Index的特性,删除这个添加新的,然后版本加1,继续创建测试:

用get方法查看,还是2

Create:创建文档,如果文档已存在,则失败;
PUT blogs/_create/1
{
"user": "Mike",
"comment": "you know"
}

PUT blogs/_create/2
{
"user": "Mike",
"comment": "you know"
}

文档更新:
Update:文档必须存在,更新只会对相应字段做增量修改, 修改一次 version 加 1
更新时需要传递一个“doc”文件对象参数,否则会有 “x_content_parse_exception” 错误,例如:
PUT blogs/_doc/5/
{
"user": "Jerry",
"sex": "w"
}
GET blogs/_doc/5

然后进行局部更新:
POST blogs/_update/5
{
"doc": {
"date": "198373",
"enable": "true"
}
}


文档删除
Delete:
DELETE blogs/_doc/5


Bulk API
发起REST API 是有网络开销的,且只能对一个索引进行操作,而Bulk API 支持一次请求中对多个索引进行多个操作。
支持的操作类型:
- Index
- Create
- Update
- Delete
POST _bulk
{ "index" : { "_index" : "test", "_id" : "1" } }
{ "field1" : "value1" }
{ "delete" : { "_index" : "test", "_id" : "2" } }
{ "create" : { "_index" : "test2", "_id" : "3" } }
{ "field1" : "value3" }
{ "update" : {"_id" : "1", "_index" : "test"} }
{ "doc" : {"field2" : "value2"} }
对多个索引的多个操作,是一次发送的,每一条的执行结果都会返回。
Mget API 批量读取
前面的Bulk api 不支持读取功能,可通过mget api 实现一次读取多个文档
get _mget
{
"docs": [
{
"_index": "movies",
"_id": 1
},
{
"_index": "blogs",
"_id": 5
}
]
}

msearch 批量查询
POST kibana_sample_data_ecommerce/_msearch
{}
{"query" : {"match_all" : {}},"size":1}
{"index" : "kibana_sample_data_flights"}
{"query" : {"match_all" : {}},"size":2}
https://www.hugbg.com/archives/1834.html


2020-04-20 12:23 下午 1F
即使你忘记我,我也不会遗忘你! —从零开始的异世界生活