上篇学习了Kibana,本期深入学习ES,包括ES是如何存储数据,其数据结构又是怎样的,以及与传统数据库的关系。
ES有很多重要概念,包括如集群、节点、索引、文档、分片、映射等内容。相比于关系数据库中的数据库、表、行(记录)、属性(字段、特征)等核心概念,ES有索引(indices)、类型(types)、文档(Documents)、fields等内容。ES是面向文档的,下面是关系数据库与Elasticsearch客观的对应关系!
Relational DB | Elasticsearch |
数据库(database) | 索引(indices) |
表(tables) | 类型(types) |
行(rows) | 文档(documents) |
字段(columns) | fields |
elasticsearch(集群) 中可以包含多个索引(数据库),每个索引中可以包含多个类型(表),每个类型又包含多个文档(行),每个文档又包含fields(字段/列)。
物理设计:
elasticsearch在后台把每个索引划分成多个分片,每个分片可以在集群中的不同服务器之间迁移。
一个人就是一个集群,默认的集群名称就是elasticsearch,如图:
逻辑设计:
一个索引类型中,包含多个文档。当检索一篇文档时,可以通过这样的顺序来查找:<索引>/<类型>/<文档id>,通过这样的组合,就可以找到具体的文档。注意:id不一定是整数,实际上它是个字符串。
下面深入理解elasticsearch的相关名词:
文档:
既然elasticsearch是面向文档的,那么意味着索引和搜索数据的最小单位就是文档,它有以下几个重要特点:
- 自我包含,一篇文档同时包含字段和对应的值,也就是同时包含key:value
- 可以是层次型的,一个文档中包含子文档(就是一个json对象)
- 灵活的结构,文档不依赖预先自定义的模式。在关系数据库中,要提前定义字段才能使用;而在es中,对于字段是非常灵活的,有时候,我们可以忽略该字段,或者动态添加一个新的字段。
类型:
类型是文档的逻辑容器,就像关系数据库一样,表格是行的容器。类型中对于字段的定义称为映射(mapping),比如字段(属性)name映射为字符串类型。文档是无模式的,它们不需要拥有映射中所定义的所有字段,比如新增一个字段,那么es是怎么做的呢?es会自动的将新字段加入映射,但是这个字段不确定它是什么类型,es就开始猜,如果这个值是18,那么es会认为它是整型。但是,es也可能猜不对,所以最安全的方式就是提前定义好所需要的映射,这点跟关系数据库殊途同归,即先定义好字段,然后再使用。
索引:
索引是映射类型的容器,就是数据库。es中的索引是一个非常大的文档集合。索引存储了映射类型的字段和其他设置,然后它们被存储在了各个分片上了。
那么分片如何工作呢?
一个集群至少包含一个节点,而这个节点就是一个es进程。节点可以有多个索引来默认。如果创建索引,那么默认索引就会有5个分片,如图:
本期总结并深入理解了es的相关概念名词,下期将学习一个新的比较有意思的内容——IK分词器。