ElasticSearch的一些核心概念
ElasticSearch是面向文档的
ElasticSearch是面向文档的,在ElasticSearch中,一切数据都是json文档。
前期可以把ElasticSearch当做是数据库看待理解,可以更好地上手ElasticSearch。
关系型数据库和ElasticSearch的概念类比:
关系型数据库 | ElasticSearch |
---|---|
数据库(databases) | 索引(indices) |
表(tables) | 类型(types) |
行(rows) | 文档(documents) |
字段(columns) | 字段(fields) |
ElasticSearch(集群)中可以包含多个索引(数据库),每个索引可以包含多个类型(表),每个类型可以包含多行(文档),每个文档可以包含多个字段(Fields)。
文档
文档就是一条条数据。
每个文档都有一个文档Id,我们可以通过 索引/类型/文档Id 来定位一个文档。文档Id不是必须要整数,实际上它是字符串。
user(类型)
{//文档1
"name":"YeHaocong",
"age":18
}
{//文档2
"name":"YeHaoxian",
"age":17
}
文档的几个重要属性:
- 自我包含:一篇文档同时包含字段和对应的值,也就是同时包含key/value。
- 可以是层次型的:一个文档包含自另外一个文档,复杂的逻辑实体就是这样来的,实际上就是一个json串。用面向对象就是一个对象包含了另外一个对象。
- 灵活的结构:文档不依赖于预先定义的模式,我们知道关系型数据库中,需要提前定义字段才能使用,在ElasticSearch中,对于字段是非常灵活的,有时我们可以忽略该字段,有时可以动态添加一个新字段。
比如:
user(类型)
{//文档1
"name":"YeHaocong",
"age":18
}
{//文档2
"name":"YeHaoxian",
"fatherName":"YeMenGuang"
}
类型
类型是文档的逻辑容器,就像关系型数据库一样,表格是行的容器。类型中对于字段的定义叫映射,比如name映射为字符串类型。比如可以对user类型的name字段与String类型做一个映射。
我们说文档是无模式的,它们不需要拥有映射中所定义的所有字段,比如新增一个字段,ElasticSearch会自动将新字段加入映射,但是不能确定这个字段是什么类型,所有ElasticSearch就会猜,比如值是18,就认为他是整形字段。但是ElasticSearch不可能保证每次都猜对,所以最安全的方式就是提前定义好所需的映射,这一点就跟关系型数据库殊途同归了,先定义好字段,再使用。
索引
类比数据库。
索引是映射类型的容器,ElasticSearch索引是一个非常大的文档集合。索引存储了映射类型的字段和其他设置,类型文档等,看作一个数据库,然后他们被存储到各个分片上。
节点与分片
一个ElasticSearch集群至少有一个节点,节点就是一个ElasticSearch服务进程,一个节点可以有多个索引。默认的,如果你创建一个索引,那么索引默认将会有5个分片(主分片)构成,每一个主分片都会有一个复制分片(副本)。分片是对索引数据的拆分。
上图说明:
上图是可能一个索引的分片在一个集群的三个节点中分布的情况的一种可能,p1-p5为主分片,p1_b-p5_b为对应的复制分片。可以看到,主分片和对应的复制分片都不会在同一个节点上,这是为了容灾,这样某个节点挂了,数据也不至于丢失,实际上,一个分片就是一个Lucene索引,一个包含倒排索引的文件目录。倒排索引使得ElasticSearch可以在不扫描全部文档的情况下,告诉你哪些文档具有特定的关键字。
倒排索引
ElasticSearch使用的是一种称为倒排索引的数据结构,采用Lucene的倒排索引作为底层,这种结构适用于快速的全文检索,一个索引文档中所有不重复的列表构成,对于每一个词,都有包含他的一个文档列表。
倒排索引就是索引倒过来了,以文档Id作为值,以关键字作为索引,更像一种散列表的结构。
比如有下面两个文档
Study every day #文档1包含内容
Learn No day #文档2包含内容
为了创建倒排索引,需要将文档内容拆分成独立的词(分词),然后创建一个包含所有不重复的词条排序列表,然后列出每个词条出现的文档Id。
词条 | 包含的文档Id |
---|---|
Study | 1 |
every | 1 |
day | 1,2 |
Learn | 2 |
No | 2 |
更像是一个hashmap结构,key是词条,不可重复,value是包含该词条的文档Id集合。
如果输入Study查询,就直接定位到文档1中,而不用扫描所以的文档。
比如检索 every day ,它就会定位到文档1和文档2,但是,由于文档1两个词都有,而文档2只有day,所以文档1的匹配度更高,分数score更高。如果没有其他条件,则两个文档都会返回。
在ElasticSearch中,索引这个词被频繁使用,在ElasticSearch中,索引被分成多个分片,每个分片是一个Lucene索引,所以一个ElasticSearch索引是由多个Lucene索引组成的,如无特指,说起索引指的是ElasticSearch索引。
上一篇: React的一些概念
下一篇: SPARQL 学习网站