ElasticSearch
ElasticSearch
中文社区 https://elasticsearch.cn/
1.1 什么是 ElasticSearch ?
ElasticSearch(弹性搜索):是一款开源的分布式、 RESTful 风格的搜索和数据分析引擎,它底层基于 Apache Lucene 开源库进行封装,其不仅仅提供分布式多用户能力的全文搜索引擎,还可以被准确形容为:
1、一个分布式的实时文档存储,每个字段可以被索引与搜索;
2、一个分布式实时分析搜索引擎;
3、能胜任上百个节点的扩展,并支持 PB 级别结构化和非结构化数据。
1.2 ElasticSearch 基本概念
1.2.1 节点&集群
Elasticsearch 本质上是一个分布式数据库,允许多台服务器协同工作,每台服务器可以运行多个 Elasticsearch 实例。单个 Elasticsearch 实例称为一个节点(Node),一组节点构成一个集群(Cluster)。
1.2.2 索引&类型&文档&字段&映射
映射关系如下图:
什么是 index (索引) ?
一个 索引 就是一个拥有几分相似特征的文档的集合。 ES 将数据存储于一个或多个索引中, 索引 就相当于 SQL 中的一个数据库。
什么是 Type(类型)?
类型是索引内部的逻辑分区(category/partition) ,然而其意义完全取决于用户需求。因此,一个索引内部可定义一个或多个类型(type)。一般来说,类型就是为那些拥有相同的域的文档做的预定义。类比传统的关系型数据库领域来说, 类型相当于 表, 7.x 版本默认使用 _doc 作为 type 。
什么是 Document(文档)?
文档是 Lucene 索引和搜索的 原子单位,它是包含了一个或多个域的容器,基于Json 格式进行表示。文档有一个或多个域组成,每个域拥有一个名字及一个或多个值,有多个值的域通常被称为 多值域,每个文档可以存储不同的域集,但同一类型下的文档至应该有某种程度上的相似之处。 相当于 mysql 表中的 row 。
什么是 Field (字段)?
Field 是相当于数据库中的 Column
上述索引&类型&文档&字段结构图如下:
什么是 Mapping(映射)?
Mapping 是定义文档及其包含的字段如何存储和索引的过程。 Mapping 是 ES 中的一个很重要的内容,它类似于传统关系型数据中 table 的 schema,用于定义一个索引(index)的某个类型(type)的数据结构。
1.2.3 分片&副本
什么是 Shard (分片)?
一个 索引 可以存储超出单个结点硬件限制的大量数据。比如,一个具有 10 亿文档的索引占据 1TB 的磁盘空间,而任一节点都没有这样大的磁盘空间;或者单个节点处理搜索请求,响应太慢。
为了解决这个问题, Elasticsearch 提供了将索引划分成多份的能力,这些份就叫做分片。当你创建一个索引的时候,你可以指定你想要的 分片的数量。每个分片本身也是一个功能完善并且独立的 索引,这个 索引 可以被放置到集群中的任何节点上。
分片之所以重要,主要的原因:
-
允许你水平分割/扩展你的内容容量
-
允许你在分片(潜在地,位于多个节点上)之上进行分布式的、并行的操作,进而提高性能/吞吐量
-
一个分片怎样分布,它的文档怎样聚合回搜索请求,是完全由 Elasticsearch管理的,对于作为用户的你来说,这些都是透明的
什么是 Replica (副本)?
副本是一个分片的精确复制,每个分片可以有零个或多个副本。副本的作用:
- 提高系统的容错性,当某个节点某个分片损坏或丢失时,可以从副本中恢复。
- 提高 ES 查询效率, ES 会自动对搜索请求进行负载均衡。