1.索引
2.字段类型(mapping)
3.文档
概述
es如何去存储数据,数据结构是什么,又是如何实现搜索的呢?我们先来聊聊es的相关概念吧。
**
集群,节点,索引,类型,文档,分片,映射是什么?

ElasticSearch是一个面向文档的数据库,其中的所有数据都是json,以下是各种专用名词和关系型数据库的对比:


关系型数据库 Elasticsearch
数据库database 索引 indices(数据库)
表tables types (以后会被启用)
行rows documents (文档)
字段columns fields

ElasticSearch中可以包含多个索引(数据库),每个索引中可以包含多个类型(表),每个类型下又包含多个文档,每个文档中又包含多个字段。

物理设计:

ElasticSearch在后台把每个索引划分为多个分片,每份分片可以在集群的不同服务器间迁移。ElasticSearch一启动就是一个集群,哪怕只有一个,默认的集群名称为:elasticsearch。

四、ES核心概念理解 - 图1

逻辑设计

在ES中,一个索引中包含多个文档,当我们索引一篇文档时,可以通过这样的顺序找到它:索引>类型>文档ID。通过这个组合我们就能索引到某个具体的文档。

文档

文档的概念换算到关系型数据库中就类似于一条数据。
ES是面向文档的,也就意味着索引和搜索数据的最小单位是文档,在ElasticSearch中,文档有几个重要属性:

  • 自我包含:一片文档同时包含字段和对应的值,也就是同时包含key-value;
  • 可以是层次型的:一个文档包含另一个文档;
  • 灵活的结构:文档不依赖预先定义的模式,我们知道关系型数据库中,要提前定义字段才能使用。在ElasticSearch中,对于字段是非常灵活的,有时候我们可以忽略该字段,或者动态的添加一个新的字段。

    类型

类型是文档的逻辑容器,就像关系型数据库中表格是行的容器一样,类型对于字段的定义称之为映射,比如说name映射为字符串类型。
我们说文档是无模式的,我们不需要对我们新增的每一个字段的类型进行映射,在没有进行映射的时候Elasticsearch会对数据的类型进行猜测,但是也有可能会猜不对,所以最安全的方式提前定义好所需要的映射,这一部分就跟关系型数据库差不多了。

索引

索引就类似于关系型数据库中的数据库。
索引是映射类型的容器,ElasticSearch中的索引是一个非常大的文档集合。索引存储了映射类型的字段和其他设置,然后他们被保存到了各个分片上。

物理设计:节点和分片如何工作

一个集群至少有一个节点,就是最基本的elasticsearch进程,每个节点可以有多个索引,如果你创建索引,则,默认会创建5个分片(又称主分片),每一个分片都会有一个副本(又称复制分片)。
四、ES核心概念理解 - 图2
例如上图是一个有三个节点的集群,可以看到主分片对应的复制分片都不会在同一个节点内,这样就有利于如果某个节点挂掉了,数据也不至于丢失,
实际上,一个分片是一个lucene索引,一个包含倒排索引的文件目录,倒排索引的结构使得ElasticSearch在不扫描全部文档的情况下,就能告诉你哪些文档包含特定的关键字。
等等,倒排索引是什么????

倒排索引

Lucene采用倒排索引作为底层,这种设计适用于快速的全文搜索。
在ElasticSearch中,倒排索引的做法是对索引中的每个单词都进行重构为一个索引列表。例如:现在有两个文档,每个文档包含内容如下:
image.png
为了创建倒排索引,我们首先将每个文档拆分成独立的词(或称为词条或者tokens),然后创建一个包含所有不重复的词条的排序列表,然后列出每个词条出现在哪个文档
四、ES核心概念理解 - 图4
现在我们视图搜索to forever,只需要查看包含每个词条的文档
image.png
两个文档都匹配,但是第一个文档比第二个匹配程度更高,如果没有别的条件,现在,这两个包含关键字的文档都将返回。
在看一个示例:
这样就可以清楚的反应每个单词在文档中的位置,当我们想要查找某个数据的时候,根据倒排索引生成的索引列表就可以最大限度的避免不符合数据的重复查询,只会在包含该数据的文档中进行查询。
例如下图数据:
四、ES核心概念理解 - 图6
在以上数据中可以得知:python这个词条,在1,2,3号文档中都有出现,linux这个词条在3,4号文档中出现,当我们想要查询linux这个词条的时候,根据倒排索引生成的索引列表,就不会再去查询1,2这两个文档,最大限度的避免了无用数据的查询。
ElasticSearch索引和Lucene索引的关系
在ElasticSearch中,每创建一个索引就会生成多个分片,其实每个分片就是一个Lucene索引,所以一个ElasticSearch索引本质就是用多个Lucene索引构成的。