elasticsearch是面向文档
关系型数据库和elasticsearch客观的对比: (其实并不能将elasticsearch看作是一个数据库)
Relational DB | Elasticsearch |
---|---|
数据库(database) | 索引(indices) |
表(tables) | types(慢慢会被弃用) |
行(rows) | documents |
字段(columns) | fields |
elasticsearch(集群)中可以包含多个索引(数据库)
每个索引中可以包含多个类型(表)
每个类型下又包含多个文档(行)
每个文档中又包含多个字段(列)。
物理设计
elasticsearch在后台把每个索引分为多个分片,每份分片可以在集群中的不同服务器间迁移
一个人就是一个集群,默认的集群名称是elasticsearch
逻辑设计
当我们索引一篇文档时,可以通过这样的顺序找到它的索引: 索引 > 类型 > 文档ID 通过这个组合就能索引到每个具体的文档 注意:ID不必是整数,实际上是个字符串
文档
就是一条条数据。
user 1 张三 18 #这就是一个文档 2 李四 16 3 王五 21
索引和搜索数据的最小单位是文档,文档的重要属性:
自我包含,一篇文档中包含字段和对应值,key:value ==> 就是一个json对象
可以是分层次型的,一个文档中包含自文档,复杂的实体就是这样来的
类型
类型是文档的逻辑容器,新增一个字段的时候,es会自动的将新加入字段加入映射。但是es自动加入的映射也有可能不正确。eg:name => String 但是es给name加入的映射是text......
索引
索引是映射类型的容器。可以理解为一个数据库。
物理设计:节点和分片如何工作
创建索引时,会定义分片的数量和副本数。(副本数是每个主分片会有一个副本,复制分片)
一个集群最少有一个节点,一个节点就是一个es进程,
上图是有3个节点的集群,可以看到主分片(p0,p1,p2,p3,p4)和对应的复制分片Replica shard(R0,R1,R2,R3,R4)都不会在同一个节点内。
默认创建索引会有五个分片(p0,p1,p2,p3,p4),一个副本-每个主分片对应的一个副本(R0,R1,R2,R3,R4)
当节点3出现问题时,也不至于把数据丢失,因为p1的复制分片在节点2中,p4在节点1中。R2本来就是复制分片。
倒排索引
Es使用的是一种称为倒排索引的结构,采用采用Lucene倒排索引作为底层。这种结构适用于快速的全文搜索,一个索引由文档中所有不重复的列表构成。对于每一个词,都有一个包含它的文档列表。
eg: Study every day,good good up to forever #文档1中包含的内容 To forever,study every day,good good up #文档2中包含的内容
为了创建倒排索引.我们首先要将每个文档拆分成独立的词(或称为词条或者tokens),然后创建一个包含所有不重复的词条的排序列表,然后列出每个词条出现在哪个文档:
term | doc_1 | doc_2 |
---|---|---|
Study | √ | × |
To | × | √ |
every | √ | √ |
forever | √ | √ |
day | √ | √ |
study | × | √ |
good | √ | √ |
to | √ | × |
up | √ | √ |
例如现在搜索 to forever
term | doc_1 | doc_2 |
---|---|---|
to | √ | × |
forever | √ | √ |
total(权重) | 2 | 1 |
两个文档都匹配 权重大于0 ,但是第一个文档比第二个文档的匹配程度更高 权重更高 。如果没有别的条件的话,现在,这两个包含关键字的文档都将被返回。
通过博客标签来搜索博客文章,那么倒排索引列表就是这样的一个结构:
博客文章(原始数据)
博客文章ID | 标签 |
---|---|
1 | python |
2 | python |
3 | linux,python |
4 | linux,python |
通过倒排索引会变成:
索引列表(倒排索引)
标签 | 博客文章ID |
---|---|
python | 1,2,3 |
linux | 3,4 |
如果要搜索python标签的文章,只需要查看所有原始数据中的标签一栏,然后获取相关的文章ID即可。完全过滤掉无关的所有数据,来提高效率! 通过value值来查询到key
es的索引和lucene的索引的对比
es中索引被分为多个分片,每份分片就是一个lucene索引。
所有一个es索引是有多个lucene索引组成的