es与关系型数据库对比
Relational DB | Elastic Search |
---|---|
数据库(database) | 索引(indices) |
表(table) | types(类型)(es8.0弃用) |
行(rows) | documents(文档) |
字段(columns) | fields |
es(集群)中可以包含多个索引(数据库),每个索引中可以包含多个类型(表),每个类型下又包含多个文档(行),每个文档又包含多个字段(列)。
物理设计:
es在后台把每个索引划分成多个分片,每份分片可以在集群中的不同服务器间迁移
逻辑设计:
一个索引类型中包含多个文档,例如:文档1、文档2,当要搜索一篇文档时,大致流程为:索引 ---> 类型 ---> 文档ID(ID不必是整数,实际上是一个字符串)
文档
es是面向文档的,也就是说索引和搜索数据的最小单位是文档,其包含有几个重要属性:
- 自我包含,一篇文档同时包含字段和对应的值,即key:value
- 层次型的:一个文档中包含自文档(json对象,fastjson进行自动转换)
- 灵活的结构:文档不依赖预先定义的模式,在关系型数据库中,要提前定义字段才能使用,而在es中,可以忽略一个字段或动态的添加一个新的字段
在es中,每个字段的类型非常重要,它会保存字段和类型之间的映射及其他的设置,这种映射具体到每个映射的每种类型,这也是为什么在es中,类型有时候也称为映射类型
类型
类型是文档的逻辑容器(就像关系型数据库,表格是行的容器),类型中对于字段的定义称为映射,比如name映射为字符串类型。
先定义好字段,再使用
索引
es中的索引就是数据库,索引是映射类型的容器,是一个非常大的文档集合,存储映射类型和其他设置,再被存放到各个分片上
物理设计:节点和分片如何工作
一个集群至少有一个节点,而一个节点就是一个es进程,创建索引时,默认5个分片(primary shard,主分片),每一个主分片会有一个副本(replica shard,复制分片)
以上图3个节点的集群为例,可以看出主分片和对应的复制分片都不会在同一个节点内,可以避免级联故障。实际上,一个分片是一个Lucence索引,一个包含倒排索引的文件目录,倒排索引使得es可以在不扫描全部文档的情况下,检索出需要的内容。
倒排索引
es使用的是倒排索引结构,采用Lucence倒排索引作为底层。这种结构适用于快速全文搜索,一个索引由文档中所有不同的列表构成,对于每一个词,都有一个包含它的文档列表。
例1:现在有两个文档,每个文档包含以下内容:
# 文档1
Study every day,good good up to forever
# 文档2
To forever,study every day, good good up
为了创建倒排索引,先要将每个文档拆分成独立的词(或称为词条、tokens),然后创建一个包含所有不重复的词条的排序列表
文档1 | 文档2 | |
---|---|---|
Study | √ | × |
To | × | √ |
every | √ | √ |
forever | √ | √ |
day | √ | √ |
study | × | √ |
good | √ | √ |
every | √ | √ |
to | √ | × |
up | √ | √ |
现在试图搜索to forever,只需要查看包含每个词条的文档
文档1 | 文档2 | |
---|---|---|
to | √ | × |
forever | √ | √ |
total | 2 | 1 |
两个文档都匹配,但第一个文档比第二个文档匹配度更高,没有别的条件时,返回这两个包含关键字的文档
例2:通过博客标签来搜索博客文章
现搜索包含python标签的文章,相较于搜索原始数据,现只需要搜索标签这一栏,即可更快的获取文章id
评论 (0)