ElasticSearch八股

2,382 阅读4分钟

为什么使用ES?

在百万级别的数据库中,如果有全表扫描或者接近全表扫描的语句,用MySQL时间会非常长,有时候还会查不出来(创意投放管理页面,你要用id或者创意名称查,根本查不出来)。

ES对模糊查询和聚合查询的支持比MySQL更好,大数据量是比MySQL更快。

同一个索引Index(table)中,可以插入任意类型的文档document(记录)。扩展性比MySQL好很多。

ES的主要术语如下:

  • Index:Elasticsearch的Index相当于数据库的Table
  • Type:这个在新的Elasticsearch版本已经废除(在以前的Elasticsearch版本,一个Index下支持多个Type--有点类似于消息队列一个topic下多个group的概念)
  • Document:Document相当于数据库的一行记录
  • Field:相当于数据库的Column的概念
  • Mapping:相当于数据库的Schema的概念
  • DSL:相当于数据库的SQL(给我们读取Elasticsearch数据的API)

ES调优知道怎么调吗?

  • 写入调优

1、写入前副本数设置为 0;

2、写入前关闭 refresh_interval 设置为-1, 禁用刷新机制;

3、写入过程中: 采取 bulk 批量写入;

4、写入后恢复副本数和刷新间隔;

5、尽量使用自动生成的 id。

  • 查询调优

1、禁用 wildcard;

2、禁用批量 terms( 成百上千的场景);

3、充分利用倒排索引机制, 能 keyword 类型尽量 keyword

4、数据量大时候, 可以先基于时间敲定索引再检索

5、设置合理的路由机制。

倒排索引

在写入数据时ES会进行分词,使用ik分词器。ES中根据某个词来查找对应的记录,这种结构称为倒排索引。

分词器的介绍:

image.png

倒排索引的结构: 通过分词,形成了词和文档的映射关系,这种字典term dict + 映射表(文档id数组)的机构即倒排索引。

image.png

Term index 词前缀,存在内存中—Term Dict 存放所用词—PostingList 存放记录的文档id。

Term index是一颗tire树

image.png

ElasticSearch中的text和keyword的区别:

image.png

Master如何选举

集群-索引-分片

image.png

ES 路由机制

niyanchun.com/routing-in-…

image.png

www.elastic.co/guide/cn/el…

image.png

image.png

ES检索(查询)过程

1、搜索被执行成一个两阶段过程,我们称之为 Query Then Fetch;

2、在初始查询阶段时,查询会被广播到索引中每一个分片拷贝(主分片或者副本分 片)。 每个分片在本地执行搜索并构建一个匹配文档的大小为 from + size 的 优先队列。 PS:在搜索的时候是会查询 Filesystem Cache 的,但是有部分数据还在 Memory Buffer,所以搜索是近实时的。

3、每个分片返回各自优先队列中 所有文档的 ID 和排序值 给协调节点,它合并 这些值到自己的优先队列中来产生一个全局排序后的结果列表。

4、接下来就是 取回阶段,协调节点辨别出哪些文档需要被取回并向相关的分片 提交多个 GET 请求。每个分片加载并 丰富 文档,如果有需要的话,接着返回 文档给协调节点。一旦所有的文档都被取回了,协调节点返回结果给客户端。

5、补充:Query Then Fetch 的搜索类型在文档相关性打分的时候参考的是本分 片的数据,这样在文档数量较少的时候可能不够准确,DFS Query Then Fetch 增 加了一个预查询的处理,询问 Term 和 Document frequency,这个评分更准确, 但是性能会变差。

(二)match过程,底层是多个上述term过程??

image.png

相关性:www.elastic.co/guide/cn/el…

ES增删改过程

我们向Elasticsearch写入数据的时候,是写到主分片上的。客户端写入一条数据,到Elasticsearch集群里边就是由节点来处理这次请求。

集群上的每个节点都是coordinating node(协调节点),协调节点表明这个节点可以做路由。比如节点1接收到了请求,但发现这个请求的数据应该是由节点2处理(因为主分片在节点2上),所以会把请求转发到节点2上。

image.png

路由到对应的节点以及对应的主分片时,会做以下的事:

1、兵分两路,一路写内存缓冲区,1s后同步到文件系统缓冲区。 2、另一路写translog日志缓冲区,每5s同步到磁盘中的translog中。 3、日志要满或者超过了30分钟,就会协同文件系统缓冲区,一起写道磁盘中。

image.png

image.png

解释一下这个过程,会有持久化,以及会涉及数据丢失:

image.png

ES中删除和更新的过程,是一致的:

image.png

ES并发问题

ES亿级数据聚合查询

ES聚合有多种类型,其中皓月用到的是两种:指标聚合和桶聚合。

真的看这一篇就可以了 www.cnblogs.com/leeSmall/p/…