基础知识
2023年8月25日大约 6 分钟
1.ES数据库基础
Elasticsearch数据库功能与特点
ES应用特点
- ES主要致力于结构化和非结构化数据的分布式实时全文搜索及分析,使用场景
- 日志管理与分析(ELK)
- 系统指标分析
- 安全分析
- 企业搜索(OA、CRM、ERP)
- 网站搜索(电商、招聘、门户)
- 应用搜索
- 应用性能管理APM
ES主要功能
- 分布式实时文件存储,处理的结构化和非结构数据
- 实时分析的分布式搜索引擎,为用户提供关键字查询的全文检索功能
- 是实现企业级PB级海量数据处理分析的大数据解决方案(ELK)
ES主要特点
分片与集群
- ES默认把数据分成多个片,多个片可以组成一个完整的数据,这些片可以分布在集群中的各个机器节点中
- 随着后期数据的越来越大,ES集群可以增加多个分片,把多个分片分散到更多的主机节点上
- ES集群可以增加多个分片,把多个分片分散到更多的机器主机节点上,负责负载均衡,横向扩展
- 而每个查询任务提交到某一个节点,该节点必须负责将数据进行整理汇聚,再返回给客户端
自动索引
- ES所有数据默认都是索引的
- ES只有不加索引才需要额外处理
搜索是近实时的
- 你往 es 里写的数据,实际上都写到磁盘文件里去了
- 查询的时候,操作系统会将磁盘文件里的数据自动缓存到 filesystem cache 里面去。
- es 的搜索引擎严重依赖于底层的 filesystem cache,你如果给 filesystem cache 更多的内存
- 尽量让内存可以容纳所有的
idx segment file
索引数据文件,那么你搜索的时候就基本都是走内存的,性能会非常高。

- 性能差距究竟可以有多大?我们之前很多的测试和压测:
- 如果走磁盘一般肯定上秒,搜索性能绝对是秒级别的,1秒、5秒、10秒。
- 但如果是走 filesystem cache,是走纯内存的,那么一般来说性能比走磁盘要高一个数量级,基本上就是毫秒级的,从几毫秒到几百毫秒不等。
ES优缺点

es核心概念
mysql | elasticsearch |
---|---|
数据库(Datebase) | 索引(Index) |
表(Table) | 类型(Type) |
行(Row)每一条 | 文档(Document)每一条 |
字段 | 属性 |
对象(Schema) | 映射(Mapping) |
索引(Index) | 万物皆索引(不管什么数据都默认索引) |
SQL语言(Select、update) | Query DSL(GET、PUT) |
索引(index)
- ES将他的数据存储在一个或多个索引中,可以向索引读写文档
- 索引相当于关系型数据库中的一个数据库
类型(type)
- 类型(type)是用来规定文档的各个字段内容的数据类型和其他的一些约束
- 一个索引(index)可以有多个文档类型(type)
文档类型(type)相当于关系型数据库中的表
文档(document)
- 在ES中,文档(document)是存储数据库的载体,包含一个或多个字段
- ES中的最小的,整体的数据单位
- 文档(document)相当于关系型数据库中的一行数据
Lucene Index
- 注意和ES Index区别,Lucene Index是由若干段和提交点文件组成
段(Segment)
- Luncene里面的一个数据集概念,因为ES底层是基于Lucene
- 最核心的概念就是Segment,每个段本身就是一个倒排索引
提交点(commit point)
- 有一个列表存放着所有已知的所有段
映射
- 映射是定义ES对索引中字段的存储类型,分词方式和是否存储等信息
- 就像数据库中的Schema,描述了文档可能具有的字段或属性,每个字段的数据类型
- Es对字段类型可以不指定,然后动态对字段类型猜测
- 也可以在创建索引时具体指定字段的类型(关系型数据库才需要手动指定)
新增Doc过程介绍
ES增加Doc过程(新增一条数据)
- 第一步:插入一条数据
- 插入一行数据Doc,Doc会先被搜索集到内存中的Buffer内(这个时候还不能搜索到)
- 因为当前数据还是在内存的Buffer中,还没有写进去
- 第二步:创建新段,写入磁盘
- 创建一个新段(Segment),作为一个追加的倒排索引,写入到磁盘(文件系统缓存)
- 将包含新段提交点(Commit Point)写入磁盘(文件系统缓存)
- 每隔一段时间将buffer提交,在flush磁盘后打开新段是的搜索可见
- 第三步:默认间隔1秒频繁refresh
- 默认间隔1秒频繁refresh,创建新的段并打开他们
- 可以使文档在没有完全刷入硬盘的状态下就能对搜索可见
- 这是ES被称为近实时搜索的原因(而且是一个开销小的操作)
- 第四:避免两次commit操作间隔发生异常Doc丢失
- 为了避免两次commit操作间隔发生异常Doc丢失(两次refresh更新)
- ES中采用了一个translog(事务日志)的概念
- 记录每次对ES操作的事务日志,还记录了尚未被flush到磁盘的操作
- 默认每5秒或者是每次请求增删改查完成后,就会写入translog并被fsysc到磁盘(在主分配和副分片都会)
ES删除Doc过程(删除、合并、更新)
- ES Doc删除
- 删除一个ES文档不会立即从磁盘中删除,它只是被标记成已删除
- 因为段是不可变的,所以文档既不能从久文档中移除,旧的段也不能更新以反映文档的版本
- ES Doc的合并
- 通过每秒自动刷新创建新的段,很快的数量就越来越多,每个段消费大量资源
- 每次搜索请求都需要依次检查每个段,段越多查询越慢
- ES利用段合并在后台选择一些小的段合并成大的段
- 合并后新的段可以被搜索,旧的段被删除
- ES Doc的更新
- 当一个文档被更新,旧版的文档被标记为删除,新版本的文档在新的段中索引
- 该文档的不同版本都会匹配一个查询,但是较旧的版本会从结果中删除