1. Elasticsearch介绍
欢迎各位读者阅读本章节!当我第一次接触到Elasticsearch的时候应该是在2013年,那时候的版本应该还只有0.9,我就被它优雅的语法、高可扩展性、高性能和易维护性等特点给深深的吸引住了,从此但开始了和Elasticsearch的亲密接触不解之缘。当时我在华为任搜索引擎技术顾问,负责构建华为内部所有文档的搜索引擎,使用的就是Elasticsearch,每日处理数TB的文档和超百万次的查询请求。
Elasticsearchr的作者是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
1.1 Elasticsearch的前世今生
Elasticsearch的前身是Shay Banon希望为做为厨师的妻子,编写一个可以快速查找菜谱的应用程序,搜索的底层还是基于Lucene来实现的,不过Shay Banon发现基于Lucene本身来实现搜索功能,是一件非常繁琐的事情,需要做很多重复性的工作,并且用户需要花时间去学习Lucene的语法和使用方式。
于是Shay Banon就基于Lucene编写了一些高级的特性,使其使用起来更加简单,并且使用大家熟悉的Json做为查询语句,经过一段时间的修改和完善,第一个版本 Compass就诞生了,后续的第二个迭代版本更名为Elasticsearch,并将该版本开源给用户,用户对这个版本的反响十分强烈,用户量急剧上升,然后根据后续的发展,就有了今天的Elasticsearch。
1.2 Elasticsearch是什么
Elasticsearch是一个底层基于Lucene库开发的分布式搜索引擎,它提供了一个在分布式环境下提供支持多用户搜索能力的全文搜索引擎,基于HTTP的RESTful接口,并使用JSON文档做为查询语句。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前最受欢迎的企业搜索引擎之一。Elasticsearch目前官方和社区支持的客户端有20多种语言实现,如Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby、GO等,完整的列表可以查看这里,可以适于各种不同的开发场景。
1.3 Elasticsearch的特性
1.3.1. 面向文档
在真实的系统环境中,数据与数据之间往往都是存在着一定的关系的,数据的信息往往都是多维度的存在着,很少会存在着孤立的、简单的数据。拿我们人来举例,常常包括姓名、性别、出生年月、电话号码和家庭住址这些基本数据,也可能包括曾经就读过的不同学校,如小学、初中、高中、大学等,还可能包括一个人在不同的时间段所工作过的公司等信息。
如果我们是把这些对象的全部属性,都扁平化存储在关系型数据库的行和列中,把他们都放在一个表里面,这相当于是把一个表现力丰富的对象挤压到一个非常大的电子表格中,在后期实现查询功能的时候,又不得不在每次查询时重新构造对象。
而Elasticsearch是面向文档的,意味着它存储的是整个对象或文档,Elasticsearch不仅仅只是存储文档,而且索引每个文档的内容使之可以被用于被检索。在Elasticsearch中,我们是对文档进行索引、检索、排序和过滤,而不是对存储于关系性数据库的行列数据。这是一种完全不同的思考数据的方式,也是Elasticsearch 能支持复杂全文检索的原因。
1.3.2. 全文检索
传统的数据库做搜索匹配,结果是要么匹配,要么不匹配,而做不到部分匹配的概念,这点是完全区别是传统数据库的一个概念。
如Elasticsearch的users索引库中存在以下两条记录:
{"name":"Tom