作者:寂寞-无解 | 来源:互联网 | 2023-05-19 17:18
- Elasticsearch介绍
本章将介绍以下内容
---------------------------------------------------------------------------------------------------
- Elasticsearch的前世今生
- Elasticsearch是什么
- Elasticsearch的特性
- Elasticsearch的应用场景
欢迎各位读者阅读本章节!当我第一次接触到Elasticsearch的时候应该是在2013年,那时候的版本应该还只有0.9,我就被它优雅的语法、高可扩展性、高性能和易维护性等特点给深深的吸引住了,从此但开始了和Elasticsearch的亲密接触不解之缘。当时我在华为任搜索引擎技术顾问,负责构建华为内部所有文档的搜索引擎,使用的就是Elasticsearch,每日处理数TB的文档和超百万次的查询请求。
Elasticsearch的作者是Shay Banon,他在2010年发布了第一个版本0.4.0,而现在Elasticsearch已经发布了7.0.0的版本,全世界有数百万的开发者和公司都在使用Elasticsearch做数据搜索和数据分析。
根据db-engines的排名调查,Elasticsearch在搜索引擎的排名中稳居第一,远超其它搜索引擎的市场占有率:
注:此图来源于https://db-engines.com/en/ranking/search+engine
在所有关系性和非关系性数据库的排名中,排名第8位:
注:此图来源于https://db-engines.com/en/ranking
-
- Elasticsearch的前世今生
Elasticsearch的前身是Shay Banon希望为做为厨师的妻子,编写一个可以快速查找菜谱的应用程序,搜索的底层还是基于Lucene来实现的,不过Shay Banon发现基于Lucene本身来实现搜索功能,是一件非常繁琐的事情,需要做很多重复性的工作,并且用户需要花时间去学习Lucene的语法和使用方式。
于是Shay Banon就基于Lucene编写了一些高级的特性,使其使用起来更加简单,并且使用大家熟悉的Json做为查询语句,经过一段时间的修改和完善,第一个版本 Compass就诞生了,后续的第二个迭代版本更名为Elasticsearch,并将该版本开源给用户,用户对这个版本的反响十分强烈,用户量急剧上升,然后根据后续的发展,就有了今天的Elasticsearch。
-
- Elasticsearch是什么
Elasticsearch是一个底层基于Lucene库开发的分布式搜索引擎,它提供了一个在分布式环境下提供支持多用户搜索能力的全文搜索引擎,基于HTTP的RESTful接口,并使用JSON文档做为查询语句。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前最受欢迎的企业搜索引擎之一。Elasticsearch目前官方和社区支持的客户端有20多种语言实现,如Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby、GO等,完整的列表可以查看这里,可以适于各种不同的开发场景。
-
-
Elasticsearch的特性
- 面向文档
在真实的系统环境中,数据与数据之间往往都是存在着一定的关系的,数据的信息往往都是多维度的存在着,很少会存在着孤立的、简单的数据。拿我们人来举例,常常包括姓名、性别、出生年月、电话号码和家庭住址这些基本数据,也可能包括曾经就读过的不同学校,如小学、初中、高中、大学等,还可能包括一个人在不同的时间段所工作过的公司等信息。
如果我们是把这些对象的全部属性,都扁平化存储在关系型数据库的行和列中,把他们都放在一个表里面,这相当于是把一个表现力丰富的对象挤压到一个非常大的电子表格中,在后期实现查询功能的时候,又不得不在每次查询时重新构造对象。
而Elasticsearch是面向文档的,意味着它存储的是整个对象或文档,Elasticsearch不仅仅只是存储文档,而且索引每个文档的内容使之可以被用于被检索。在Elasticsearch中,我们是对文档进行索引、检索、排序和过滤,而不是对存储于关系性数据库的行列数据。这是一种完全不同的思考数据的方式,也是Elasticsearch 能支持复杂全文检索的原因。
-
-
- 全文检索
传统的数据库做搜索匹配,结果是要么匹配,要么不匹配,而做不到部分匹配的概念,这点是完全区别是传统数据库的一个概念。
如Elasticsearch的users索引库中存在以下两条记录:
{
"name":"Tom",
"hobby":"He likes go skating in the winter"
}
|
{
"name":"Jake",
"hobby":"He likes skating at home"
}
|
执行如下搜索语句:
GET /users/_search
{
"query" : {
"match" : {
"about" : "go skating"
}
}
}
|
搜索结果中包括了这两条记录,虽然只有第一条记录包括了“go skating”,但是第二记录包括了“skating”,实现了部分匹配。不过这里需要注意的是,虽然两条记录都查询出来了,但是他们的匹配权重是不一样的,匹配最多的会优先展示,这个会在后续的课程中讲到。
-
-
- 分布式
Elasticsearch是一个P2P协议(使用gossip协议)且天生就具有分布式特性的系统,除了集群状态管理以外,其他所有的请求都可以发送到集群内任意一台节点上,这个节点可以自己找到需要转发给哪些节点,并且直接跟这些节点通信。应用可根据本身的需求特点,最多可以将Elasticsearch横向扩展至数百(甚至数千)的服务器节点,且其同时可以处理PB级数据量的数据。由于Elasticsearch具有这些特性,因而它可服务于超大型公司,也可以运行于单机之上,服务于小微型公司。
Elasticsearch在分布式方面几乎是透明的,完全不需要用户的干预,当有新的节点增加或者有旧的节点被去掉,Elasticsearch会自动实现集群的扩展和收缩,自动实现数据的迁移的分布,并最终达到平衡。
-
-
- 数据分析
Elasticsearch通过内置的聚合函功能,通过该功能可以对数据做精细的分析,如对数据的分组(类似于SQL的Group by)、对数据进行求平均、筛选MAX或MIN数据等。
如_count是对当前索引库中所有数据的统计并返回总数结果:
这个和SQL中的count函数类似,但是SQL中的count函数需要执行全表扫描才能够得到结果,而Elasticsearch中是直接获取到记录总数,速度上快很多,特别是在大数据量的情况下,差异会更加明显。
Elasticsearch的数据分析功能,再结果Kibana的展现功能,就可以组合出非常直观的报表,如下所示示例截图:
-
- Elasticsearch的架构
这是一个具有3个Elasticsearch节点的集群,每个索引具有2个分片和2个副本,可以看出数据是相对均匀的分散到各个节点上,这种架构天然具有良好的扩展性和容灾性。应用程序调用Elasticsearch执行查询操作时,每个节点都应该用做请求入口,如使用轮询的方式,Elasticsearch优先会从本身节点获取数据,获取不到的分片数据再通过其它的节点获取,这样可以将查询请求压力分散到各个节点。
-
- Elasticsearch的应用场景
Elasticsearch的主要功能是用于数据搜索以及数据分析,操作非常方便,使用的是易于理解的Json做为查询语句,并且有着丰富的客户端和社区支持。因而只要是涉及到数据搜索和数据分析的场景,Elasticsearch都可以大显伸手,以下是举例的一些应用场景。
电影网站
|
可以让用户通过搜索方便的找到自己需要的电影
|
电商网站
|
用户通过搜索,可以方便到找到自己商品
|
社交网站
|
提供给用户查找好友的功能,增加用户粘性
|
新闻网站数据分析
|
给到每篇新闻文章的作者,让他知道他的文章的公众反馈(好,坏,热门,垃圾,鄙视,崇拜)
|
大型源码管理
|
提供代码搜索功能
|
日志数据分析
|
通过ELK(Elasticsearch+Logstash+Kibana)提供方便的日志收集功能和直接日志分析展示结果
|
这里只是例举了部分示例,同时也说明了Elasticsearch广阔的应用场景。
后续的章节会讲Elasticsearch的安装,包括的内容:
单节点的安装、多节点的安装、安装Head插件、安装Kibana、通过Docker安装等内容