ElasticSearch核心概念

 2022-07-19    0 条评论    10057 浏览

es

ElasticSearch的核心概念有Node(节点)、Cluster(集群)、Shards(分片)、Replicas(副本、备份)、Index(索引)、Type(类型(此概念7.x以上废弃))、Document(文档)、Setting(索引设置)、Mapping(属性设置)和Analyzer(分词)

集群概念

  • Node:节点。节点是构成ES集群的基本服务单元,集群中的每个运行的服务器都是一个Node
  • Cluster:集群。具有相同Cluster.name(默认elasticsearch)的一个或多个Node组成。各个Node协同工作,共享数据。在实际使用中,一般自定义集群的名字,好处是防止新增的节点加入相同网络中的另一个同名的集群中。
    • 集群有三种状态
      • green:绿色代表健康,每个主分片和副本的正常
      • yellow:黄色代表预警,所有主分片都正常,但是至少一个副本分片是不能正常工作的。此时集群能工作,但是高可用被弱化。
      • red:红色代表问题。此时集群无法使用。集群中至少有一个分片的主分片以及它的副本分片不能正常工作。虽然集群还能使用,但是只能返回正常分片中的数据,问题分片无法查询也无法写入。会导致数据丢失
  • Shards:分片,数据实际存储的位置。当索引的数据量过大时,受限于单个节点的内存和磁盘处理能力,节点无法足够快速的响应客户端请求,此时需要将索引上的数据进行水平拆分。
    • 拆分出来的每个数据部分称为一个分片。通常每个分片都在不同的服务器上。分片操作后,索引规模扩大,性能水涨船高。
    • ES依赖Lucene,ES中的每个分片都是一个索引文件,所以每个分片都要有一个主分片和零到多个副本分片。
    • 创建索引时,需要指定分片数量,且不能更改。写入数据时根据路由决定写入那个分片中。
    • 查询索引数据时,需要在索引对应的多个分片上进行查询。发送查询请求到每个分片,将查询结果汇总返回。对于上层应用来说,并不知道分片的存在。
    • ES中,创建索引时,默认5个分片,并每个分片一个副本。
  • Replicas:备份。也叫做副本,即每个分片对应的副本。和其他集群设计一样。
    • 副本功能如下:
      • 对主分片数据备份
      • 提供查询。
      • 主分片写入数据时,主从复制
      • 主分片挂了时,推举出来代替主分片。
    • 优缺点:
      • 优点:提高集群可用性,防止数据丢失,提高并发性能。
      • 缺点:写入数据时,主从数据同步。副本分片多且写入数据过多时,会增加写分片同步负担。

数据结构概念

  • Index:索引。在ES中,索引由一个或者多个分片组成。使用索引时,需要通过索引名称在集群内唯一标识。索引给我们的感觉类似mysql中的数据库。实际上index是一个逻辑空间,将多个shards串联起来,数据实际上存储在了shards中。
  • Type:类别。类别是索引内部的逻辑分区,通过Type的名字在索引内进行唯一标识。如果查询无此类型,则会整个索引中查询。type在高版本es中已经被删除,不建议使用了。
  • Document:文档。索引中每条数据都叫做一个文档,与关系数据库中的一条数据类似。
    • 一个文档通过_id在Type中唯一标识。(高版本ES已经去除了Type这个概念)。
    • 文档中可以有不同的字段结构,但是同一个字段必须是相同类型。
    • 文档中同一个字段可以出现多次不同的值,这类字段叫做多值字段。
  • Settings:集群中索引的定义信息,比如索引的默认的分片数,副本数等。
  • Mapping:定义了索引中字段(Field)的存储类型和分词方式、是否存储等信息,类似关系数据库的表结构信息。
  • Analyzer:字段分词方式的定义。

核心内容解析

Document文档

  • 每个文档中都存储了_index、_type、_id以及其他信息
  • index索引串联了所有各自索引下文档的分组关系。
  • 实际上文档的数据是存储在了不同的分片中,但是我们不需要关心。
  • _id这是一个可指定可自生的长字符串,代表每个文档的唯一标识

Mapping

ES每个索引都有对应的mapping信息,存储字段类型以及其他的信息,新建索引时可以指定mapping信息。 如果进入文档中的字段在mapping中没有预设,则根据字段值自动认定类型 关系如下:

true、falseboolean
123long
123.456double
2020-01-25date
1.1.1.1IP
字符串text、keyword

注意:text属于全文搜索,会被分词。而keyword属于精确搜索,不会被分词,只能精确搜索到。

Mapping示例:
  • number_of_shards:分片个数
  • number_of_replicas:副本个数
  • "doc_values": true:是否可用于聚合查询
{
    "settings": {
        "index": {
            "number_of_shards": "3",
            "number_of_replicas": "0"
        }
    },
    "mappings": {
        "_source": {},
        "properties": {
            "time": {
                "type": "date"
            },
            "ip": {
                "type": "ip",
                "doc_values": true
            },
            "content": {
                "type": "text",
                "fields": {
                    "keyword": {
                        "ignore_above": 256,
                        "type": "keyword"
                    }
                }
            }
        }
    }
}