ElasticSearch—10大核心概念

前言

在学习一门技术时,咱们首先想到的资料确定是官方文档,这是最权威的第一手资料。然而,有些官方文档中出现的概念,若是没有必定知识储备,看起来会显得晦涩难懂。就好比在ES中,有几个核心概念咱们必需要理解,这些在官方文档中每每做为术语来使用,只有理解了这些概念才能更深刻的学习ES。下面是我在学习ES过程当中,对ES核心概念的总结,结合了官方文档和本身的理解,若是发现描述有错误,请你们在评论区留言,多多交流!html

字段 Field

字段在ES中能够理解为JSON数据的键,下面的JSON数据中,name 就是一个字段。数据库

{
    "name":"jack"
}

文档 Document

文档 在ES中至关于传统数据库中的的概念,ES中的数据都以JSON的形式来表示,在MySQL中插入一行数据和ES中插入一个JSON文档是一个意思。下面的JSON数据表示,一个包含3个字段的文档json

{
    "name":"jack",
    "age":18,
    "gender":1
}

映射Mapping

映射 是对文档中每一个字段的类型进行定义,每一种数据类型都有对应的使用场景。例如:string的数据会被做为全文原本处理,这种数据类型适合须要搜索的场景。有些数据类型,你不须要对它进行搜索,相反须要对它作聚合运算,那么keywordinteger 数据类型就更合适。
正如上面说的,每一个文档都有映射,可是在大多数使用场景中,咱们并不须要显示的建立映射,由于ES中实现了动态映射。咱们在索引中写入一个下面的JSON文档,在动态映射的做用下,name会映射成text类型,age会映射成long类型。服务器

{
    "name":"jack",
    "age":18,
}

既然有动态映射,咱们固然也能够自定义映射,在深度使用中,咱们须要对数据类型进行精确的控制,以达到咱们实际场景的要求,ES可能不知道咱们须要数据类型,这种状况下咱们可使用自定义映射。经过映射API,咱们能够方便的建立修改查看删除映射。架构

索引 Index

索引是ES中最大的数据单元,至关于关系型数据库中 的概念。前面咱们说一个文档 至关于MySQL中一行数据,若是按照关系型数据库中的对应关系,还应该有的概念。ES中没有的概念,这是ES和数据库的一个区别,在咱们创建索引以后,能够直接往 索引 中写入文档。在6.0版本以前,ES中有Type的概念,能够理解成关系型数据库中的,可是官方说这是一个设计上的失误,因此在6.0版本以后Type就被废弃了。app

分片 Shards

上面咱们说索引是ES中最大的数据存储单元,咱们能够往索引中不断写入文档,到了必定数量级,索引文件就会占满整个服务器的磁盘,磁盘容量只是其中一个问题,索引文件变的大,会严重下降搜索的效率。怎么解决这个问题呢?分片就是用来解决这些问题的,简单来说,分片就是把单索引文件分红多份存储,且这些索引的分片能够分部在不一样的机器上。假设单台机器磁盘容量1TB,如今须要存放5TB的索引数据,那就能够把5TB索引分红10份,分别存放到10台机器上每份500G,这就是所谓的分片负载均衡

副本 Replicas

咱们已经知道,一个索引能够分红多个分片,分部在不一样的机器上。那假设上面所说的10台机器中有一台发生故障了,在这台机器上的分片也就没了,就会致使索引损坏。为了解决索引高可用的问题,ES引入了副本机制,这里的副本指的就是分片的副本,分片的原始数据称为主分片,主分片和副本会放在不一样的机器上,这样假设有一个分配丢失了,另外的分片能够做为后备。若是主分片的机器挂掉了,其中一个副本分片就会升级成主分片。同时,由于副本分片的工做和主分片是同样的,因此增长副本的数量能够提高查询性能。性能

词项 term

在传统关系型数据库中,假如想要存储一篇几千字的文本,能够经过text直接存进去,和存储其它类型的数据没什么不一样。存储虽然很方便,可是要对文本中的关键词进行搜索,查询速度很是慢,尤为是在大数据量的时候。仍是上面的场景,在ES中存储这篇文章,它不会直接存进去,而是先把大文本切割成不少个小的词,这些词就是咱们所说的词项 ,它是ES搜索的最小单位,每一个查询都是按词项搜索的。ES使用了倒排索引来存储数据,什么是倒排索引?在关系型数据中,最好的方式是用主键id来查询,能够快速定位到文章内容,而倒排索引则相反,它创建的是词项和文章id的对应关系,索引它更适合文本搜索,下面是一个倒排索引,hello和world这两个词都命中了id=1的文章。学习

词项 term 文章id
hello 1
world 1

倒排索引底层原理决定了ES天生适合作全文本搜索。大数据

分析器 Analyzers

前面说过,ES中不会把一篇文章直接存入磁盘,在存储时它会先对文本进行分析,分析器的就是用来分析这些文本,中间包括过滤、分词等过程,通过分析处理后再存储到磁盘。分析器由3部分组成,分别是字符过滤器分词器词项处理器。字符过滤器把原始文本做为字符流来处理,它能够过滤一些特殊字符、html标签等;分词器是分析器的核心部分,它负责把大文本分割成多个词项,好比文本 "Quick brown fox!",能够被分割成 3个词项,[Quick, brown, fox!] 词项处理器接受词项流,它能够移除一些不须要的词。ES提供了多种分析器,默认使用标准的分析器,能知足大部分的需求,实在不行也可使用自定义的分析器,除了分析器之外,分词器、字符过滤器等在ES中也提供了多种选择。

节点 Node & 集群 Cluster

简单来说,节点就是一个ElasticSearch进程,当咱们启动一个ElasticSearch程序,就启动了一个节点,不少个节点集合在一块儿就成了集群,即便只有单个节点,也能够把它当作只有单个节点的集群。节点也分多种类型,主要分为 主节点数据节点协调节点Ingest节点,每一个节点都有各自的职责,若是集群中只有单个节点,那这个节点会扮演多个节点的角色,它须要独自完成整个搜索和索引的过程。集群对外提供服务时,至关于一个总体,集群中的每一个节点均可以处理Http请求,每一个请求通过一系列内部转发,处理完成后返回数据给外部客户端。集群内部每一个节点之间通讯使用Java API ,它的底层是基于TCP的自定义协议,而对于外部客户端,ES使用的是Restful风格的Http协议。

总结

说了这么多核心概念,可能一会儿很差理解,下图是我画的ElasticSearch的总体架构图。集群中有4个节点,其中2个为数据节点,专门用来存放数据和创建索引,索引P由2个分片组成,分片P1和P2的主分片分别存放在数据节点-2数据节点-1中,P1和P2各有1个副本分片,存放在另外一台数据节点中,这样能够保证的即便数据节点-1挂掉了,数据节点-2仍然有完整的数据,P2的副本分片将升级为主分片;主节点负责一些轻量级的操做,用于分片分配等;协调节点只能用于请求的路由,至关于负载均衡器。每一个节点之间经过点对点的方式进行TCP通讯,请求不须要通过主节点。
最后,但愿本篇文章能帮助你理解ES的核心概念!
图片描述