常见的五种数据库为:redis、mysql、ES、hbase、hive。其中的es是一种容纳较大规模并且交互性好的数据库,还是一个分布式文档数据库,其中每个字段都可被索引,而且每个字段的数据都可以被搜索到,可以在短时间内存储、搜索和分析大量的数据。
1、ES数据库的简介
es数据库的英文全称为ElsticSearch,是位于Elastic Stack核心的分布式搜索和分析引擎。是一个由Apache开源的高扩展、全文检索和分析引擎(NoSQL数据库功能)的系统,它可以准实地快速存储、搜索、分析海量的数据。
全文检索:全文检索是指计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引。指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找到的结果反馈给用户的检索方式。这个过程如同通过字典中的检索字表查询字的过程,全文搜索是搜索引擎数据库中的数据。
2、ES数据库的特点
① 基于java/lucene构建,支持实时搜索
② 分布式部署,可横向集群扩展
③ 支持百万级数据
④ 支持多条件查询,如聚合查询
⑤ 高可用,数据开源进行切片备份
⑥ 支持Restful风格的api调用
3、ES的应用场景
① 监控。对日志类数据进行存储、分析、可视化。对日志数据,ES给出了ELK的解决方案。其中logstash采集日志,ES进行复杂的数据分析,转换你的日志,并将他们存储在es中,kibana进行可视化展示。
② 线上商城系统,用户需要搜素购物系统网站上的商品信息。es可以存储所有的商品信息和一些库存信息,用户通过搜索引擎可以查询到自己需要的商品信息。
③ json文档数据库。用于存放java格式的文档。
④ 提供全文搜素并高亮关键字。
4、ES数据库和关系型数据库的比较
关系数据库 ⇒ 数据库 ⇒ 表 ⇒ 行 ⇒ 列(Columns)
Elasticsearch ⇒ 索引(Index) ⇒ 类型(type) ⇒ 文档(Docments) ⇒ 字段(Fields)
ES关系型数据库索引(index)数据库(DataBase)类型(Type)表(Table)映射(Mapping)表结构(Schema)文档(Document)行(ROw)字段(Field)列(Column)反向索引正向索引DSL查询SQL查询
Segment:段,Lucence中存储时按段来进行存储,每个段相当于一个数据集。
Commit Point:提交点,记录着Lucence中所有段的集合。
Lucence Index:Lucene索引,由一堆Segment段集合和commit point组成。
Lucene:Apache开源的全文检索开发工具包,就是一个java的jar包。
redismysqlelasticsearchhbasehadoop/hive容量/容量扩展低中较大海量海量查询时效性极高中等较高中等地查询灵活性较差(k-v模式)非常好,支持sql较好,关联查询较差,但可以全文检索,DSL语言可以处理过滤、匹配、排序、聚合等各种操作较差,主要靠rowkey,scan的性能不行,或建立二集索引非常好,支持sql写入速度极快中等较快较快慢一致性、事务弱强弱弱弱
- ① 关系型数据库中的数据库(DataBase),等价于ES中的索引(Index)
- ② 一个数据库下面有N张表(Table),等价于1个索引Index下面有N多类型(Type)
- ③ 一个数据库表(Table)下的数据由多行(ROW)多列(column,属性)组成,等价于1个Type由多个文档(Document)和多Field组成。
- ④ 在一个关系型数据库里面,schema定义了表、每个表的字段,还有表和字段之间的关系。 与之对应的,在ES中:Mapping定义索引下的Type的字段处理规则,即索引如何建立、索引类型、是否保存原始索引JSON文档、是否压缩原始JSON文档、是否需要分词处理、如何进行分词处理等。
- ⑤ 在数据库中的增insert、删delete、改update、查search操作等价于ES中的增PUT/POST、删Delete、改_update、查GET。
5、ES的工作原理
5.1、lucence存储和检索
lucence的存储和查询过程主要是:
存储过程:
- ① 存储文档经过词法分析得到一系列的词(Term)
- ② 通过一系列词来创建形成词典和反向索引表
- ③ 将索引进行存储并写入硬盘。
查询过程:
- ① 用户输入查询语句。
- ② 对查询语句经过词法分析得到一系列词(Term) 。
- ③ 通过语法分析得到一个查询树。
- ④ 通过索引存储将索引读入到内存。
- ⑤ 利用查询树搜索索引,从而得到每个词(Term) 的文档链表,对文档链表进行交、差、并得到结果文档。
- ⑥ 将搜索到的结果文档对查询的相关性进行排序。
- ⑦ 返回查询结果给用户。
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都处理完之后,就返回结果给客户端。
5.3、 ES读数据
ES读数据是通过doc_id来进行查询,先根据doc_id判断出文档存储在哪个切片上,再从切片上把数据读取过来。
ES读数据流程:
① 客户端给任意一个节点发送请求,该节点变为协调节点
② 协调节点根据doc_id,进行哈希取值,判断出文档存储在哪个切片上。
③ 协调节点将请求转发到对应的节点上,然后使用随机轮询算法(round-robin),在切片和副本切片中随机选择一个,以使读请求负载均衡
④ 接收请求的节点返回文档数据给协调节点,协调节点再返回数据给客户端。
5.4、 ES检索关键词
ES检索关键词流程:
ES检索关键词是ES最常使用的做法,通过关键词,将包含关键词的文档全部搜索出来。
① 客户端向任意一个节点发送请求,该节点变为协调节点
② 协调节点将搜索请求转到所有的shard上
③ 每个shard将自身的检索结果(搜索到的doc_id和分数),返回给协调节点。
④ 协调节点根据检索结果进行相关性排序,产出最终的结果。再把doc_id发送给各个节点,拉取文档数据,最终返回给客户端。
5.5、 ES删数据
删除操作,是在commit 的时候会生成一个.del文件,里面将doc标识为deleted状态,搜索的时候根据.del文件就知道这个 doc 是否被删除了。
版权归原作者 欢喜躲在眉梢里 所有, 如有侵权,请联系我们删除。