02 | ElasticSearch 基本概念

逸兴
逸兴
逸兴
57
文章
25
评论
2020-03-3021:03:341 3312字阅读11分2秒
摘要

本文介绍es的基本概念,如索引,排序,Query String 查询,以及Elasticsearch聚合分析等

基本概念一: 文档,索引,REST API

文档:

ElasticSearch 是面向文档的,文档是所有可搜索数据的最小单位。如cerebro中

02 | ElasticSearch 基本概念

比如: messages 日志中的一条日志,一张专辑里面的一首歌曲,这些在es中都是一个文档。

文档特性:

ElasticSearch 会把“文档”序列化成一个json格式数据,保存到es中。

  • json 对象由“字段”组成;
  • 每个字段又都有其数据类型(字符串/整形/布尔型/等);
  • 每一个文档,都有一个UID, 这个uid可以手动指定,也可以自动生成;
  • 需要注意字段是可以嵌套的;

例如:

02 | ElasticSearch 基本概念

文档元数据:

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

02 | ElasticSearch 基本概念

索引

索引可以看做是一类“文档”的集合,上面提到message日志中的一条日志是一个文档,那么整个message文件可以看做一个索引。同样的一张专辑是一个索引,里面的每一首歌曲则是一个个的文档。

  • 每个索引都有自己的Mapping定义,用来定义包含的文档的字段名,和字段类型;
  • 索引中的数据分散在shard上;
  • 索引通过Mapping定义文档中的字段的类型结构;
  • 索引通过setting 定义文档中的数据分布,就是关于shard的设置;

REST API

02 | ElasticSearch 基本概念
es rest api

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

02 | ElasticSearch 基本概念

基本概念二:节点,集群,分片及副本

集群

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信息
      • 分片的路由信息
  • 如果任意节点都能修改信息,会导致数据的不一致

关于Data Node 与 Coordinating Node

  • Data Node
    • 数据存储节点,保存分片数据;
    • 通过增加Data Node ,实现存储扩容;
  • Coordinating Node
    • 负责接收Client的请求,并将请求分发到合适的节点,最终把结果汇集到一起;
    • 每个节点默认都起到了Coordinating Node的职责;

其他类型的节点:

02 | ElasticSearch 基本概念

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

02 | ElasticSearch 基本概念

分片 shard

分片分为两类:主分片 和 副本分片

  • 主分片- Primary Shard
    • 用以解决数据的水平扩展问题。通过主分片,可以将数据分布到集群内的所有节点上
      • 一个分片是一个运行的Lucene 的实例;
      • 主分片数在创建索引时指定,后续不能修改,除非Reindex;
  • 副本分片 - Replica Shared
    • 用于解决数据高可用的问题,副本分片是主分片的拷贝
    • 副本分片数可以动态调整;
    • 增加副本数,在一定程度上可以调高服务的读取吞吐量;

各节点中索引的分片分布情况:

以一个三节点的索引为例:

  "blogs": { - 
    "settings": { - 
      "index": { - 
        "number_of_shards": "3",
        "number_of_replicas": "1",
      }
    }
  }

在索引blogs中创建了3个主分片,1个副本分片,看下cerebro中的展示:

02 | ElasticSearch 基本概念

假设有一个节点es01出现故障导致导致其上的 主分片 0 和 主分片 2 丢失,可以通过es02 上的副本分片0 和es03 上的副本分片2 恢复主分片数据,从而保证数据完整性。

分片的设定

生成环境中分片设定,需要提前做好容量规划:

  • 分片数设置过小
    • 导致后续无法增加节点实现水平扩展;
    • 单个分片上的数据量会过大,导致数据重新分配耗时;
  • 分片数设置过大
    • 影响搜索结果的相关性打分,影响统计结果的准确性;
    • 单个节点上过多的分片,会导致资源浪费,同时也会影响性能;

查看集群的健康状况:

02 | ElasticSearch 基本概念

ElasticSearch 有三种颜色表示集群的健康状况:

  • Green 主分片和副本分配正常分配
  • Yellow 主分片正常分配,有副本分片未能正常分配
  • Red 有主分片未能正常分片

查看索引和分片

02 | ElasticSearch 基本概念

文档的CRUD与基本操作

文档读取:获取文档内容

Read:

// 获取movies索引中id为1的文档内容
GET movies/_doc/1
02 | ElasticSearch 基本概念

文档创建:

Index:如果文档不存在,则创建。如果存在,先删除现有文档,在创建新文档,版本加1

PUT blogs/_doc/1
{
  "user": "Mike",
  "comment": "you know"
}

创建成功:

02 | ElasticSearch 基本概念

查看这个创建的文档:

GET blogs/_doc/1
02 | ElasticSearch 基本概念

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

02 | ElasticSearch 基本概念

用get方法查看,还是2

02 | ElasticSearch 基本概念

Create:创建文档,如果文档已存在,则失败;

PUT blogs/_create/1
{
  "user": "Mike",
  "comment": "you know"
}
02 | ElasticSearch 基本概念

PUT blogs/_create/2
{
  "user": "Mike",
  "comment": "you know"
}
02 | ElasticSearch 基本概念

文档更新:

Update:文档必须存在,更新只会对相应字段做增量修改, 修改一次 version 加 1

更新时需要传递一个“doc”文件对象参数,否则会有 “x_content_parse_exception” 错误,例如:

PUT blogs/_doc/5/
{
  "user": "Jerry",
  "sex": "w"
}

GET blogs/_doc/5
02 | ElasticSearch 基本概念

然后进行局部更新:

POST blogs/_update/5
{
  "doc": {
    "date": "198373",
    "enable": "true"
  }
}
02 | ElasticSearch 基本概念
02 | ElasticSearch 基本概念

文档删除

Delete:

DELETE blogs/_doc/5
02 | ElasticSearch 基本概念
02 | ElasticSearch 基本概念

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
    }
    ]
}
02 | ElasticSearch 基本概念

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-03-3021:03:34
  • 除非特殊声明,本站文章均为原创,转载请务必保留本文链接
06 | 分片实现原理及生命周期 Elastic Stack

06 | 分片实现原理及生命周期

ElasticSearch 的分片,在Lucene 中又被称为 Index 在学习分片前,先介绍几个概念,有助于更清晰的认识分片。 带着这三个问题,看下面的文档。 为什么ES的搜索是近实时的?ES 如...
05 | 分布式特特性及分布式搜索机制 Elastic Stack

05 | 分布式特特性及分布式搜索机制

01 集群分布式模型及选主与脑裂问题 Es分布式特性优点存储的水平扩容,支持PB级数据提高系统可用性,部分节点停止服务,集群服务不受影响Es的分布式架构每个集群都有一个集群名字,各个节点通过指定集群名...
03 | 倒排索引 & 分词 Elastic Stack

03 | 倒排索引 & 分词

Elasticsearch 为什么搜索块,Elasticsearch 使用一种称为 倒排索引 的结构,它适用于快速的全文搜索。 本文简单介绍“倒排索引” 和 es内置分词器,以及中...
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

评论:1   其中:访客  1   博主  0
    • 浮光 浮光

      即使你忘记我,我也不会遗忘你! —从零开始的异世界生活