Elasticsearch
一、Elasticsearch是什么?
Elasticsearch 是一个非常强大的搜索引擎。它目前被广泛地使用于各个 IT 公司。Elasticsearch 是由 Elastic 公司创建。它的代码位于 GitHub - elastic/elasticsearch: Free and Open, Distributed, RESTful Search Engine。Elasticsearch 是一个分布式、免费和开放的搜索和分析引擎,适用于所有类型的数据,包括文本、数字、地理空间、结构化和非结构化数据。
Solar也是顶级的开源搜索引擎,也是基于lucene;elasticsearch与Solar相比安装更加简单,对于一些复杂的搜索支持更好,在大数据量下,elasticsearch的性能更好,现在被很多公司大量的使用。
我们可以看到数据库搜索引擎排名已经很高了:DB-Engines Ranking

二、Elasticsearch发展
2.1 Elasticsearch发展史
2004年,shay banon(谢伊·班农)基于lucene开发了compass。
2010年,shay banon重构了compass,取名为elasticsearch,使其支持分布式和水平扩展。
2012年,Elasticsearch BV公司被创建,围绕Elasticsearch及相关软件提供商业服务和产品。
2015年,Elasticsearch公司更名为Elastic.
Lucene 是一个高性能的搜索引擎库,它提供索引数据和搜索数据的功能,内部非常复杂,elasticsearch利用了lucene的高性能,封装了它的复杂性,对外可以提供rest接口,不同语言的应用都可以调用。
轶事:
2004年,shay banon失业了,准备给他厨师老婆做一个食谱的搜索引擎,如果直接使用Lucene很难,所以他把使用lucene抽象了一下,并开源了,开发者可以直接在程序里使用compass来进行搜索,2010年的时候,它已经重构了compass,取名为elasticsearch,支持分布式和水平扩展。
2.2 Elasticsearch重要版本
Elastic的版本维护政策维护当前主要版本的最新次要版本,以及上一个主要版本的最新次要版本,例如8.3.2,8主版本,3为次要版本,2为修复bug的版本。它的具体的版本政策可以查看(https://www.elastic.co/cn/support/eol)
三、Elasticsearch应用场景
Elastic公司围绕着elasticsearch构建一整套生态系统,适用了很多热门的使用场景, Elasticsearch 基于 Apache Lucene 构建,并于 2010 年由 Elasticsearch N.V. 首次发布(现在称为 Elastic)。
- Elasticsearch 以其简单的 REST API、分布式特性、速度和可扩展性而闻名,是 Elastic Stack 的核心组件,Elastic Stack 是一组用于数据摄取、丰富、存储、分析和可视化的免费开放工具。 通常被称为 ELK Stack。
- Logstash: Logstash是一个开源的数据收集、处理和传输工具。它可以从各种来源(如日志文件、消息队列、数据库等)收集数据,并对数据进行过滤、转换和格式化,最后将数据发送到Elasticsearch等目标存储或分析系统。Logstash支持多种输入和输出插件,可以与各种数据源和目标进行集成,使数据的收集和传输变得简单和可靠。
- Kibana: Kibana是一个开源的数据可视化和分析平台,用于在Elasticsearch中探索、分析和可视化数据。它提供了丰富的图表、图形和仪表盘,可以帮助用户深入了解数据的特征和趋势。通过Kibana,用户可以创建交互式的仪表盘,自定义查询和过滤条件,实时监控数据,并将结果以可视化的方式展示出来。Kibana还支持插件扩展,可以根据需要添加额外的功能和定制化。
这个三个项目组合在一起,就形成了 ELK 软件栈。他们三个共同形成了一个强大的生态圈。简单地说,Logstash 负责数据的采集,处理(丰富数据,数据转换等),Kibana 负责数据展示,分析,管理,监督,警报及方案。Elasticsearch 处于最核心的位置,它可以帮我们对数据进行存储,并快速地搜索及分析数据。随着后来的 Beats 加入,ELK 软件栈,也被称为 ELKB。
- Beats是Elasticsearch提供的一组轻量级数据采集工具,用于收集各种类型的数据并将其发送到Elasticsearch或Logstash进行处理和存储
所以上 Elasticsearch 的完整栈有如下的几个:
- Beats
- Elasticsearch
- Kibana
- Logstash
如下图:
通常不会在客户端直接调用 Elasticsearch 的 REST 接口。取而代之的是,我们使用一个 Search Service 作为中间接口。Search Service 再向 Elasticsearch 发送请求。可以通过 Beats 来采集 service 的日志及指标信息,甚至可以使用 Elastic Stack 所提供的 APM (应用性能监控)来监控应用及服务的性能并调优。Beats 所收集的信息,可以直接发送至 Elasticsearch,也可以发送至 Logstash 对数据做更进一步的加工(丰富,转换,删除,结构化等)再发送至 Elasticsearch。可以通过 Kibana 对数据进行可视化,分析,管理,对服务进行监控等。
四、正向索引和倒排索引
Lucene的核心技术就是倒排索引
4.1.正向索引
传统数据库一般情况下,会基于id创建一个索引,形成一个b+树,根据id进行检索的速度非常快,这种方式的索引是正向索引;
如果搜索的字段不是id,是普通title字段,一般它不会加索引,即使加了索引,而使用的模糊匹配,即使字段上有索引,它也不会生效,没有索引,数据库会逐条扫描,判断每一行数据里面是否包含手机,不包含丢弃,逐行扫描最终会拿到完整的结果集;
如果数据表的数据非常多,做局部内容检索的时候,逐行扫描性能非常差;
下面以tb_goods表进行演示如下:

4.2.倒排索引
elasticsearch采用倒排索引:
- 文档(document):每条数据就是一个文档
- 词条(term):文档按照语义分成的词语
倒排索引:经过了两次检索,第一次是根据用户的词条,去词条列表中进行查找,找到对应的文档id。第二次是根据文档id找文档。虽然是两次查找,但是每次都经过了索引进行查找,总的查询效率比逐条扫描高的多

总结:
- 正向索引:正向索引当中找是否包含手机的,需要一行一行的看,是先找到文档,看这条数据符合不符合要求 是根据文档找到词
- 倒排索引:是基于词条创建索引,关联到文档,小找到词,再找到对应的文档,是根据词找文档
- 倒排索引更适合与基于文档的内容够进行搜索,也就是说更复杂的需求
五、Elasticsearch常见概念
5.1.文档
elasticsearch是面向文档存储的,可以是数据库中的一条商品数据,一个订单信息。文档数据会被序列化为json格式后存储在elasticsearch中。

5.2.索引(Index)
在Elasticsearch中,索引是数据的逻辑容器,用于组织和存储相关的文档。索引类似于数据库中的表,它包含了一组具有相似结构的文档。将数据存储到Elasticsearch中时,需要指定一个索引来标识这些数据的类型和特征。索引可以包含多个文档,每个文档都是一个JSON格式的数据对象。每个文档都有一个唯一的ID,用于在索引中进行唯一标识和检索。
通过将数据存储在索引中,可以使用Elasticsearch的搜索功能来快速查询和检索数据。Elasticsearch使用倒排索引的数据结构来实现高效的全文搜索,它可以在大规模数据集上快速地执行复杂的搜索操作。
此外,索引还支持数据的分片和复制。当你的数据量很大时,Elasticsearch会将索引分成多个分片,每个分片可以在集群中的不同节点上进行存储和处理,从而实现数据的水平扩展和并行处理。复制机制可以提高数据的可靠性和容错性,确保即使某个节点发生故障,数据仍然可用。
- 索引(index):相同类型的文档的集合
- 映射(mapping):索引中文档的字段约束信息,类似表的结构约束
文档和索引的关系图如下:

5.3.概念对比
MySQL和Elasticsearch中概念对比说明如下:

说明:
- 在MySQL里SQL写好了通过Connnection把SQL发出去给Mysql处理执行
- 在Elasticsearch里写好DSL 基于http的请求发出去的,在Elasticsearch中暴露的是RestFUL的接口,这样就跟语言无关,任何语言只要能发http请求都可以把DSL发给Elasticsearch处理(可以在不同语言中使用Elasticsearch)。
5.4.架构说明
那么在什么场景下使用MySQL和Elasticsearch:
- Mysql:擅长事务类型操作,可以确保数据的安全和一致性
- Elasticsearch:擅长海量数据的搜索、分析、计算
架构图如下:

说明如下:
- MySQL 和Elasticsearch两个各司其职,如果实现的是下单付款的业务,对事务要求很高,应该使用MySQL作为数据存储
- 如果是商品的搜索、页面的搜索,搜索比较复杂,使用ES去做


浙公网安备 33010602011771号