1.ES数据库的简介
es数据库的英文全称为ElsticSearch,是位于Elastic Stack核心的分布式搜索和分析引擎,是一个由Apache开源的高扩展、全文检索和分析引擎(NoSQL数据库功能)的系统,它可以准时地快速存储、搜索、分析海量的数据。
全文检索:全文检索是指计算机索引通过扫描文章中的每一个词,对每一个词建立索引,指名该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找到的结果反馈给用户的检索方式,这个过程如同通过字典中的检索字表查询字的过程,全文搜索是搜索引擎数据库中的数据
2.ES数据库的特点
a:基于java/lucene构建,支持实时搜索
b:分布式部署,可横向集群扩展
c:支持百万级数据
d:支持多条件查询,如聚合查询
e:高可用,数据开源进行切片备份
f:支持RestFul风格的api调用
3.ES的应用场景
a:监控,对日志类数据进行存储、分析、可视化,对日志数据,ES给出了ELK的解决方案,其中logstash采集日志,ES进行复杂的数据分析,转换你得日志,并将他们存储在es中,kibana进行可视化展示
b:线上商城系统,用户需要搜索购物系统网站上的商品信息,ES可以存储所有的商品信息和一些库存信息,用户通过搜索引擎可以查询到自己需要的商品信息
c:json文章数据库,用户存放java格式的文档
d:提供全文搜索并高亮关键字
4.ES数据库和关系型数据库的比较
关系型数据库:数据库 ⇒ 表 ⇒ 行 ⇒ 列(Columns)
ES:索引(Index) ⇒ 类型(type) ⇒ 文档(Docments) ⇒ 字段(Fields)
Segment:段,Lucence中存储时按段来进行存储,每个段相当于一个数据集。
Commit Point:提交点,记录着Lucence中所有段的集合。
Lucence Index:Lucene索引,由一堆Segment段集合和commit point组成。
a:关系型数据库中的数据库(DataBase),等价于ES中的索引
b:一个数据库下面有N张表(table),等价于1个索引Index下面有N多类型(Type)
c:一个数据库表(Table)下面的数据由多行(ROW)多列(Column,属性)组成,等价于1个Type由多个文档(Document)和多Field组成
d:在一个关系型数据库里面,schema定义了表,每个表的字段,还有表和字段的关系,与之对应的在ES中:Mapping定义索引下的Type的字段处理规则,即索引如何建立、索引类型、是否保存原始索引JSON文档、是否压缩原始JSON文档、是否需要分词处理、如何进行分词处理等
e:在关系型数据库中的增insert、删delete、改update、查search操作等价于ES中的增PUT/POST、删Delete、改_update、查GET
5.ES的工作原理
5.1、lucence存储和检索
lucence的存储和查询过程主要是:
存储过程:
a:存储文档经过词法分析得到一系列的词(Term)
b:通过一系列的词来创建形成词典和反向索引表
c:将索引进行存储并写入硬盘
查询过程:
a:用户输入查询语句
b:对查询语句进行词法分析得到一系列词(Term)
c:通过 语法分析得到一个查询树
d:通过索引存储将索引读入到内存
e:利用查询书搜索索引,从而得到每个词(Term)的文档链表,对文档链表进行交、差、并得到结果文档
f:将搜索得到的结果文档对查询的相关性进行排序
g:返回查询结果给用户
5.2 ES写数据
ES写数据分别是写入一个新的文档和在原有文档的基础上进行数据的追加(覆盖原有的文档),两者基本上没有什么区别,后者是把原来的文档进行删除,再重新写入
ES写数据流程:
1.客户选择一个ES节点发送写请求,ES节点接收请求变为协调节点
2.协调节点判断写请求中如果没有指定文档id,则自动生成一个doc_id,协调节点对doc_id进行哈希取值,判断出文档应存储在哪个切片中,协调节点找到存储切片的对应节点位置,将请求转发给对应的node节点
3.Node节点的primary shard处理请求,并将数据同步到replica shard
4.协调节点发现所有的primary shard和所有的replica shard都处理完之后,就返回给客户端
名词解释:
在ES中,每个索引都被分成多个分片(shard),每个分片都是一个独立的Lucene索引,当索引被创建时,必须指定分片的数量,其中一个分片被指定为主分片(primary shard),其余的分片被指定为副本分片(relica shard),主分片负责处理所有的读写请求,而副本分片则只是主分片的一个副本,用于提高可用性和性能,主分片的数量再索引创建时被指定,一旦创建后就不能更改
5.3 ES读数据
ES读数据是通过doc_id来进行查询,先根据doc_id判断出文档存储在哪个切片上,再从切片上把数据读取过来
ES读数据流程:
1.客户端给任意一个节点发送请求,该节点变为协调节点
2.协调节点根据doc_id,进行哈希取值,判断出文档存储在哪个切片上
3.协调节点将请求转发到对应的节点上,然后使用随机轮询算法,在切片和副本切片中随机选择一个,以使读请求负载均衡
4.接收请求的返回文档数据给协调节点,协调节点再返回数据给客户端
5.4 ES检索关键词
ES检索关键词流程:
ES检索关键词是ES最常使用的做法,通过关键词,将包含关键词的文档全部搜索出来
1.客户端向任意一个节点发送请求,该节点变为协调节点
2.协调节点将搜索请求转发到所有的shard上
3.每个shard将自身的检索结果(搜索到的doc_id和分数),返回给协调节点
4.协调节点根据检索结果进行相关性排序,产出最终的结果,再把doc_id发送给各个节点,拉取文档数据,最终返回给客户端
5.5 ES删数据
删除操作,是在commit的时候会生成一个.del文件,里面将doc表示为deleted状态,搜索的时候根据.del文件就知道这个doc是否被删除了