目录
ES核心概念
1、字段(Fields)
2、文档(Documents)
3、映射(Mapping)
4、索引(Index)
字段是ES中最小的独立单元数据,每一个字段有自己的数据类型(可以自己定义覆盖ES自动设置的数据类型),我们还可以对单个字段设置是否分析、分词器等等。
核心的数据类型有string、Numeric、DateDate、Boolean、Binary、Range等等,复杂类型有Object、Nested。
在ES中文档的概念相当于RDBMS中的一行数据,不同的是在ES中文档的存储是直接使用json格式存储的(也就是可以嵌套),而不是像RDBMS中把数据"压平"了存储,这一点也是nosql和关系型数据库比较大的区别。
下面是一个文档的例子
{
"_id": 3,
“_type”: [“your index type”],
“_index”: [“your index name”],
"_source":{
"age": 28,
"name": ["daniel”],
"year":1989,
}
}
”Mapping is the process of defining how a document, and the fields it contains, are stored and indexed.“
也就是Mapping是定义文档和字段如何存储和索引,使用Mapping可以定义下面这些信息
在ES中是最大的数据存储概念,它是由许多具有相同特征的文档组成的一个集合。 由于在ES7.0之后逐渐废除Type类型,所以Index从”数据库“的概念变成了实际上的”表“概念,我们可以把它近似地当成RDBMS中的表,但是要注意Index只是一个逻辑上的概念,真实的数据是分开存储在各个分片中的。
和关系型数据库的类比
一个Elasticsearch集群会有多个Elasticsearch节点,所谓节点实际上就是运行着Elasticsearch进程的机器。在众多的节点中,其中会有一个Master Node
,它主要负责维护索引元数据、负责切换主分片和副本分片身份等工作(后面会讲到分片的概念),如果主节点挂了,会选举出一个新的主节点。
从上面我们也已经得知,Elasticsearch最外层的是Index(相当于数据库 表的概念);一个Index的数据我们可以分发到不同的Node上进行存储,这个操作就叫做分片。
比如现在我集群里边有4个节点,我现在有一个Index,想将这个Index在4个节点上存储,那我们可以设置为4个分片。这4个分片的数据合起来就是Index的数据
为什么要分片?原因也很简单:
现在问题来了,如果某个节点挂了,那部分数据就丢了吗?显然Elasticsearch也会想到这个问题,所以分片会有主分片和副本分片之分(为了实现高可用)
数据写入的时候是写到主分片,副本分片会复制主分片的数据,读取的时候主分片和副本分片都可以读。
如果某个节点挂了,前面所提高的Master Node
就会把对应的副本分片提拔为主分片,这样即便节点挂了,数据就不会丢。
到这里我们可以简单总结一下Elasticsearch的架构了: