ElasticSearch系列之什么是ElasticSearch?
1、搜索是什么?
概念:用户输入关键词,搜索引擎返回包含改关键词的所有信息
- 互联网搜索:比如百度,谷歌,博客,新闻网站搜索等等
- 站内搜索:也称为垂直搜索。企业OA内部搜索人员信息、部门信息。电商内部商品的搜索等等
2、什么是ElasticSearch?
ElasticSearch是一款开源的高扩展的分布式全文检索引擎,可以近实时地查询分析数据。实现基于Lucene,封装了许多Lucene底层的功能,提供了简单易用的RestFul API接口和很多语言的客户端,如Java的高级客户端(Java High Level REST Client)和底层客户端(Java Low Level REST Client)
起源:Shay Banon。2004年失业,陪老婆去伦敦学习厨师。失业在家帮老婆写一个菜谱搜索 擎。封装了lucene的开源项目,开发出了项目compass。找到工作后,做分布式高性能项目,再封装 compass,写出了elasticsearch,使得lucene支持分布式。现在是Elasticsearch创始人兼Elastic 首席执行官。
3、Lucene和ElasticSearch
- Lucene提供了全文搜索的底层实现,api使用起来相对比较复杂;ElasticSearch是基于Lucene实现的,封装了Lucene比较复杂的底层功能,提供了简单易用的RESTFul API
- Lucene本来就是专注于搜索底层的实现,所以只是单节点的;elasticSearch提供了企业级的分布式实现
4、ElasticSearch和数据库搜索
ElasticSearch相对数据库搜索来说,在数据量很大时候可以体现出来,比如pb级别数据。数据库搜索的缺点
- 存储问题:电商网站商品上亿条时,单表数据量太大必须进行拆分表,数据库磁盘占用太多时需要进行分库
- 性能问题:搜索商品时,需要对上亿条商品数据进行扫描,性能跟不上
- 不能分词:比如输入关键词“笔记本电脑”,只能搜索和关键字匹配一样的数据,“电脑”这些数据不能模糊查询出来
pb:PB是数据存储容量的单位,它等于2的50次方个字节,或者在数值上大约等于1000个TB
5、ElasticSearch的特点
- 分布式:ElasticSearch可以将海量数据分散到多台服务器上去存储和检索,可以进行并行查询,提高搜索效率。相对的,Lucene是单机应用。
- 近实时:数据库查询上亿条数据,需要比较长时间,是批处理(batch-processing)。而ElasticSearch可以秒级查询海量的数据,所以叫近实时
6、ElasticSearch使用场景
ElasticSearch支持分布式和大数据场景,可以应用于多个领域。比如:
- 搜索:最常见的就是搜索,比如电商的商品搜索
- 日志数据分析:logstash采集日志,ES进行复杂的数据分析,ELK技术(elasticSearch+logstash+kibana)
- 商品价格监控:用户订阅某商品的阈值,当低于改阈值时,发送消息给用户
- 商业智能:BI系统,商业智能(Business Intelligence)。大型连锁超市,根据全国所有网点传过来的数据分析所有商品在哪个季节销售量最好,利润最高。还可以进行成本管理,店面租金,员工工资,负债等信息进行分析。从而部署下一个阶段的战略目标。
下面列举国外国内应用ElasticSearch的例子: 国外:
- 维基百科:类似百度百科,以elasticsearch为基础的核心搜索架构
- StackOverflow:程序讨论论坛,相当于程序员的贴吧。
- GitHub:开源代码管理平台,搜索上千亿行代码
- SoundCloud:使用ElasticSearch为1.8亿用户提供即时而精准的音乐搜索服务 国内:
- 百度搜索:百度搜索目前广泛使用ElasticSearch作为文本数据分析,收集百度所有服务器上的各类指标数据及用户自定义数据,通过对各种数据进行多维分析展示。单集群最大100台机器,200个ES节点,每天导入30TB+数据
- 阿里:使用ElasticSearch构建挖财自己的日志采集和分析体系等等
- 新浪:使用ElasticSearch分析处理32亿条实时日志等等
7、ElasticSearch核心概念
- NRT(Near Realtime):近实时,写入数据时,需要过1秒才能被搜索,因为内部需要分词、录入索引。ES搜索和分析数据时需要秒级出结果
- Cluster:集群,多个节点组成ES的集群。
- Node:节点,也就是一个ES实例。节点名称可以自动分配,也可以手动配置。
- Index:索引,倒排索引,有相似结构的文档数据。
索引创建规则:
- 仅限小写字母;
- 不能包含
\、/、*、?、"、<、>、|、#
以及空格符等特殊符号;(从7.0版本开始不能再包含冒号) - 不能以
-
、_
或+
开头 - 不能超过255个字节
- Document:文档。其实就类似于数据库中一条数据,通常以json方式返回。多个document存在于一个索引(index)中。
- Field:字段。就像数据库的列,定义每个document应该有的字段。
- Type:类型。一个index可以对应一个或者多个type,type是index中的逻辑数据分类。在5.x版本,index下面可以创建多个type;在6.x版本,一个index下只能存在一个type;在7.x版本直接去除了type;
为什么要在7.x版本去除type? 还是要先从ElasticSearch的设计历史说起,因为关系型数据库比非关系型数据库的概念要提出的早,而且很成熟,应用广泛。所以后面很多nosql,比如MongoDB、ElasticSearch都参考了传统关系型数据库的概念。需要有一个对应数据库中表的概念,所以就设计了type对document进行归类。但是ElasticSearch是基于Lucene的,ES为什么搜索快?主要是因为要index,也就是倒排索引,并非是因为type,多个type查询时候反而会减慢查询的速度。为了保持ElasticSearch“一切为了搜索”的宗旨,适当的去除type也是无可厚非的。但是很多项目都已经应用了type,所以推迟到7.x版本才完成这个版本升级
- shard:分片。index数据量过大时,将index里面的数据,分为多个shard,分布式的存储在各个服务器上。可以支持海量数据和高并发,提高性能和吞吐量,充分利用多cpu
- replica:副本。在分布式环境,任何一台机器都有可能会出现宕机的情况,如果出现这种情况,一个index的分片数据丢了,可能导致此index不能正常搜索。所以,为了保证安全,需要将每一个index的分片进行备份,存储在另外服务器。正常提供查询和插入的分片我们叫主分片(primary shard),其余的称之为备份的分片(replica shard)
8、对比关系型数据库概念
关系型数据库(MySQL) | 非关系型数据库(ElasticSearch) |
---|---|
数据库Database | 索引Index |
表Table | 索引Index(7.x之前版本为type) |
数据行Row | 文档Document |
数据列Column | 字段Field |
约束Schema | 映射Mapping |
参考资料
- ElasticSearch官网
- 全文搜索引擎 Elasticsearch 入门教程 from 阮一峰老师
- ElasticSearch入门篇(保姆级教程)
- ElasticSearch系列教程