1.elasticsearch的数据组织
(1)逻辑设计和物理设计
启动kibana可能会慢一些,点一个enter,尝试一下
逻辑设计包括:文档,类型,索引
物理设计包括:节点和分片
逻辑设计:
一个索引类型中,包含多个文档,比如文档1,文档2,...
当我们索引一篇文章时,可以通过下面的顺序找到(索引>类型>文档ID),通过这个组合我们就能索引到某个具体的文档.
注意,ID不必是整数,实际上是字符串
文档:
elasticsearch是面向文档的,那么就意味着索引和搜索数据的最小单位是文档
类型:
类型是文档的逻辑容器,就像关系型数据库一样,表格是行的容器
索引:
索引是映射类型的容器,elasticsearch中的索引是一个非常大的文档集合.
物理设计:节点和分片
一个集群包含至少一个节点,而一个节点就是一个elasticsearch进程,节点内可以有多个索引.
如果创建一个索引,那么这个索引将会有5个分片(primary shard,又称主分片)构成,而每个分片又有一个副本(replica shard,又称复制分片),这样,就有了10个分片.
那么这个所有是如何存储在集群中的呢?
上图是有3个节点的集群可以看到主分片和对应的复制分片都不会再同一个节点内,这样有利于某个节点挂掉了,数据也不至于丢失.
实际上,一个分片是一个lucene索引,一个包含倒排索引的结构使得elasticsearch在不扫描全部文档的情况下,就能钙素你哪些文档包含特定的关键字.
P代表分片,R代表复制分片.
elasticsearch的数据组织
(2)mysql和es对比
mysql es
数据库 索引
表 类型
行 文档
字段 字段
关系型数据库中 可以有多个表
es中也说5版本前一个索引可以有多个类型,原因es根据luence来的,所以可能存在问题.
1个数据库只能有一张表,我们将他们分开才行.
elasticsearch将每个索引划分为多个分片,每个分片又可以在集群中的不同服务器见迁移.
(3)倒排索引
elastic 使用的是一种倒排索引的结果,采用luence的倒排索引作为底层,这种结构适合快速的全文搜索,一个索引由文档中所有不重复的列表构成,对于每一个词,都有一个包含它的文档列表.
例如,现在有两个文档,每个文档包含如下内容
Study every day, good good up to forever # 文档1包含的内容
To forever, study every day, good good up # 文档2包含的内容
为了创建倒排索引,我们首先要将每个文档拆分成独立的词(或称为词条或者tokens),然后创建一个包含所有不重复的词条的排序列表,然后列出每个词条出现在哪个文档:
两个文档都匹配,但是第一个文档比第二个匹配程度更高。如果没有别的条件,现在,这两个包含关键字的文档都将返回。
再来看一个示例,比如我们通过博客标签来搜索博客文章。那么倒排索引列表就是这样的一个结构:
如果要搜索含有python
标签的文章,那相对于查找所有原始数据而言,查找倒排索引后的数据将会快的多。只需要查看标签这一栏,然后获取相关的文章ID即可。
不重复且唯一的词条
(4)elasticsearch的索引和Lucene的索引对比
在elasticsearch中,索引
这个词被频繁使用,这就是术语的使用。
并且elasticsearch将索引被分为多个分片,每份分片是一个Lucene的索引。所以一个elasticsearch索引是由多个Lucene索引组成的。别问为什么,谁让elasticsearch使用Lucene作为底层呢!
如无特指,说起索引都是指elasticsearch的索引。
示例1:
s18/doc/1
索引/类型/id
PUT是添加的意思
示例2:
GET指的是查找的意思
示例3:
上边是字符串查询
示例4:查询所有以及删除
示例5:
得到右边的结果:
示例6,看一下主分片:
得到下面的结果:
示例7:
得到下面的结果
别名的优点:用户感受不到数据的变化,悄悄的在后台做
用别名做查询的优点.
参考blog:NB的开哥