1. 什么是 elasticsearch

elasticsearch 是一个开源的分布式搜索引擎,可以用来实现搜索、日志统计、分析、系统监控等功能,底层是基于 lucene 来实现的。
Lucene 是一个 Java 语言的搜索引擎类库,是 Apache 公司的顶级项目。

image.png
image.png

image.png

1.1. 特性

  1. 第一、采用 Master-slave 架构,实现数据的分片和备份
  2. 第二、使用 Java 编写,并对 Lucene 进行封装,隐藏了 Lucene 的复杂性
  3. 第三、能胜任上百个服务节点的扩展,并支持 PB 级别的结构化或者非结构化数据
  4. 第四、ES 提供的 Restful API,不仅简化了 ES 的操作,还支持任何语言的客户端提供 API 接口,另外 Restful API 的风格还实现了 CURD 操作、创建索引,删除索引等功能。

1.2. 什么是 elastic stack(ELK)

  • 是以 elasticsearch 为核心的技术栈,包括 beats、Logstash、kibana、elasticsearch

2. 倒排索引

倒排索引的概念是基于 MySQL 这样的正向索引而言的。

2.1. 正向索引

那么什么是正向索引呢?例如给下表(tb_goods)中的 id 创建索引:
image-20210720195531539

如果是根据 id 查询,那么直接走索引,查询速度非常快。

但如果是基于 title 做模糊查询,只能是逐行扫描数据,流程如下:

1)用户搜索数据,条件是 title 符合 "%手机%"
2)逐行获取数据,比如 id 为 1 的数据
3)判断数据中的 title 是否符合用户搜索条件
4)如果符合则放入结果集,不符合则丢弃。回到步骤 1

逐行扫描,也就是全表扫描,随着数据量增加,其查询效率也会越来越低。当数据量达到数百万时,就是一场灾难。

2.2. 倒排索引

倒排索引中有两个非常重要的概念:

  • 文档(Document):用来搜索的数据,其中的每一条数据就是一个文档。例如一个网页、一个商品信息
  • 词条(Term):对文档数据或用户搜索数据,利用某种算法分词,得到的具备含义的词语就是词条。例如:我是中国人,就可以分为:我、是、中国人、中国、国人这样的几个词条

2.2.1. 创建倒排索引

创建倒排索引 是对正向索引的一种特殊处理,流程如下:
%%
▶12.🏡⭐️◼️【🌈费曼无敌🌈⭐️♨️♨️♨️⭐️】◼️⭐️-point-20230313-1542%%
❕ ^km4l5x

  • 将每一个文档的数据利用算法分词,得到一个个词条
  • 创建表,每行数据包括词条、词条所在文档 id、位置等信息
  • 因为词条唯一性,可以给词条创建索引,例如hash 表结构索引

image-20210720200457207

2.2.2. 使用倒排索引

倒排索引的 搜索流程 如下(以搜索 “ 华为手机 “ 为例):

1)用户输入条件 "华为手机" 进行搜索。
2)对用户输入内容 分词,得到词条:华为手机
3)拿着词条在倒排索引中查找,可以得到包含词条的文档 id:1、2、3。
4)拿着文档 id 到正向索引中查找具体文档。

如图:
image-20210720201115192

2.2.3. 为什么快

虽然要先查询倒排索引,再查询正向索引,但是无论是词条、还是文档 id 都建立了索引,查询速度非常快!无需全表扫描。

2.3. 正向和倒排

那么为什么一个叫做正向索引,一个叫做倒排索引呢?

  • 正向索引 是最传统的,根据 id 索引的方式。但根据词条查询时,必须先逐条获取每个文档,然后判断文档中是否包含所需要的词条,是 根据文档找词条的过程
  • 倒排索引 则相反,是先找到用户要搜索的词条,根据词条得到保护词条的文档的 id,然后根据 id 获取文档。是 根据词条找文档的过程

正向索引

  • 优点:
    • 可以给多个字段创建索引
    • 根据索引字段搜索、排序速度非常快
  • 缺点:
    • 根据非索引字段,或者索引字段中的部分词条查找时,只能全表扫描。

倒排索引
%%
▶13.🏡⭐️◼️【🌈费曼无敌🌈⭐️♨️♨️♨️⭐️】◼️⭐️-point-20230313-1547%%
❕ ^3zq0wh

  • 优点:
    • 根据词条搜索、模糊搜索时,速度非常快
  • 缺点:
    • 只能给词条创建索引,而不是字段
    • 无法根据字段做排序

3. 相关概念

3.1. 文档和字段

elasticsearch 是面向**文档(Document)存储的,可以是数据库中的一条商品数据,一个订单信息。文档数据会被序列化为 json 格式后存储在 elasticsearch 中:

image-20210720202707797

而 Json 文档中往往包含很多的 字段(Field),类似于数据库中的列。

3.2. 索引和映射

索引(Index),就是相同类型的文档的集合

例如:

  • 所有用户文档,就可以组织在一起,称为用户的索引;
  • 所有商品的文档,可以组织在一起,称为商品的索引;
  • 所有订单的文档,可以组织在一起,称为订单的索引;
    image-20210720203022172
    因此,我们可以把索引当做是数据库中的表。

数据库的表会有约束信息,用来定义表的结构、字段的名称、类型等信息。因此,索引库中就有 映射(mapping),是索引中文档的字段约束信息,类似表的结构约束。

3.3. MySQL 与 Elasticsearch

我们统一的把 mysql 与 elasticsearch 的概念做一下对比:

image.png

是不是说,我们学习了 elasticsearch 就不再需要 mysql 了呢?

并不是如此,两者各自有自己的擅长支出:

  • Mysql:擅长事务类型操作,可以确保数据的安全和一致性
  • Elasticsearch:擅长海量数据的搜索、分析、计算

因此在企业中,往往是两者结合使用:

  • 对安全性要求较高的写操作,使用 mysql 实现
  • 对查询性能要求较高的搜索需求,使用 elasticsearch 实现
  • 两者再基于某种方式,实现数据的同步,保证一致性

MongoDB 与Elasticsearcharch

https://www.cnblogs.com/xuzhujack/p/15798610.html

4. 使用方法

https://www.bilibili.com/video/BV1LQ4y127n4?p=91&spm_id_from=pageDriver&vd_source=c5b2d0d7bc377c0c35dbc251d95cf204

5. ES 集群⭐️🔴

5.1. 选主算法

https://juejin.cn/post/7051761366591340574
在 7.x 版本前后,Elasticsearch 采用了不同的选主算法。7.x 之前基于 Bully 算法选主,之后基于 Raft 算法。

6. 面试题

6.1. 谈谈对 ES 的理解

ES 全称是 Elastic Search,它是一个建立在全文搜索引擎库 Lucene 基础上的开源搜索和分析引擎。ES 它本身具 有分布式存储、检索速度快的特性。所以,我们经常会用它来实现全文检索的功能。 Elastic 官网对 ES 的定义已经不再是 ElasticSearch 这一个组件,而是指 Elastic Stack 生态。
而 Elastic Stack 主要包括 ElasticSearch、Logstash、Kibana,这三个经典组合也称之为 ELK。ElasticSearch 主 要用来做数据存储、Logstash 主要用来做数据采集,Kibana 主要用来做数据可视化展示。

6.2. 为什么这么快⭐️🔴

image.png

1、ES 是基于 Lucene 开发的一个全文搜索引擎,一方面 Lucene 是擅长管理大量的索引数据;另外一方面,它会对数据进行分词以后再保存索引。这样,能够去提升数据的检索效率。
2、ES 采用了倒排索引。所谓倒排索引就是通过属性值来确定数据记录位置的索引,从而避免全表扫描的问题。
3、ES 存储数据采用了分片机制。
4、ES 扩展性很好,支持通过水平扩展的方式来动态增加节点,从而提升 ES 的处理性能。能够支持上百台服务器节点的扩展,并且支持 TB 级别的结构化数据和非结构化数据
5、ES 内部提供的数据汇总和索引生命周期管理的功能,更加便于高效地存储和检索数据

7. 实战经验

  1. es 里面复杂的关联查询尽量别用,一旦用了性能都不太好。最好是先在 Java 系统 里就完成关联,将关联好的数据直接写入 ES 中
  2. 避免一些太复杂的操作,比如 join/nested/parent-child 搜索,不然容易出现性 能问题。
  3. 避免深分页查询,ES 集群的分页查询支持 from 和 size 参数,查询的时候,每个 分片必须构造一个长度为 from+size 的优先队列,然后回传到网关节点,网关节 点再对这些优先队列进行排序找到正确的 size 文档。当 from 足够大的时候,就算 不发生 OOM,也会影响到 CPU 和带宽等,从而影响到整个集群的性能。

8. 参考与感谢

8.1. 黑马

8.1.1. 视频

https://www.bilibili.com/video/BV1LQ4y127n4/?p=91&spm_id_from=pageDriver&vd_source=c5b2d0d7bc377c0c35dbc251d95cf204

8.1.2. 资料

1
/Users/taylor/Nutstore Files/Obsidian_data/pages/002-schdule/001-Arch/001-Subject/005-分布式专题/微服务开发框架SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式微服务全技术栈课程