ES 是什么?看完这篇就不要再问这种低级问题了

【每日五分钟学习大数据】系列 No.19

最近在给公司其他部门的同事输出关于 ElasticSearch (下面都简称ES) 的培训,内容从入门到(精通/放弃),反响还不错,有望在年底再冲一波绩效,哈哈。 所以,独乐乐不如众乐乐,我整理了下大纲,脱敏了一些内容,发出来给大家一起学习一下,先从最基础的开始,后面会一步步深入,欢迎持续关注。

言归正传,要说ES那不得不先提一下 Apache Lucene,Lucene 是当下最先进、高性能、全功能的搜索引擎库。

而ES是用 Java 编写的,它的内部使用 Lucene 做索引与搜索,但是它的目的是使全文检索变得简单, 通过隐藏 Lucene 的复杂性,取而代之的提供 一套简单一致的 RESTful API

  • 一个分布式的实时文档存储,每个字段 可以被索引与搜索

  • 一个分布式实时分析搜索引擎

  • 能胜任上百个服务节点的扩展,并支持 PB 级别的结构化或者非结构化数据

发展历程

先来看看官网提到的一个有意思的小故事

许多年前,一个刚结婚的名叫 Shay Banon 的失业开发者,跟着他的妻子去了伦敦,他的妻子在那里学习厨师。 在寻找一个赚钱的工作的时候,为了给他的妻子做一个食谱搜索引擎,他开始使用 Lucene 的一个早期版本。 

直接使用 Lucene 是很难的,因此 Shay 开始做一个抽象层,Java 开发者使用它可以很简单的给他们的程序添加搜索功能。 他发布了他的第一个开源项目 Compass。

后来 Shay 获得了一份工作,主要是高性能,分布式环境下的内存数据网格。这个对于高性能,实时,分布式搜索引擎的需求尤为突出, 他决定重写 Compass,把它变为一个独立的服务并取名 Elasticsearch。 

第一个公开版本在2010年2月发布,从此以后,Elasticsearch 已经成为了 Github 上最活跃的项目之一,他拥有超过300名 contributors。 一家公司已经开始围绕 Elasticsearch 提供商业服务,并开发新的特性,但是,Elasticsearch 将永远开源并对所有人可用。 

据说,Shay 的妻子还在等着她的食谱搜索引擎…

Elasticsearch 后来作为一家公司(Elastic公司)进行运作,定位为数据搜索和分析平台。在2014年6月获得7000万美元融资,累积融资过亿美元。

ES现在可以与Java、Ruby、Python、PHP、Perl、.NET等多种客户端集成。也可与Hadoop、Spark等大数据分析平台进行集成,功能十分强大。

基于Elasticsearch衍生出了一系列开源软件,统称为 Elatic Stack。包括了大家熟悉的ELK(ElasticSearch/Logstash/Kibana)等。

ES的特性和场景

1. 特性

分布式: 横向扩展非常灵活

全文检索: 基于lucene的强大的全文检索能力;

近实时搜索和分析: 数据进入ES,可达到近实时搜索,还可进行聚合分析

高可用: 容错机制,自动发现新的或失败的节点,重组和重新平衡数据

模式自由: ES的动态mapping机制可以自动检测数据的结构和类型,创建索引并使数据可搜索。

RESTful API: JSON + HTTP

2. 场景

  • 站内搜索

  • NoSQL数据库

  • 日志分析

  • 数据分析

相关概念对比 RDBMS

ES的核心概念

1. 节点(Node)

一个运行中的 Elasticsearch 实例称为一个节点,而集群是由一个或者多个拥有相同cluster.name配置的节点组成, 它们共同承担数据和负载的压力。

ES集群中的节点有三种不同的类型,一个节点可以充当一个或多个角色,默认三个角色都有:

  • 主节点: 负责管理集群范围内的所有变更 ,例如增加、删除索引,或者增加、删除节点等。 主节点并不需要涉及到文档级别的变更和搜索等操作。 node.master: true 

  • 数据节点: 存储数据和其对应的倒排索引 默认每一个节点都是数据节点(包括主节点),可以通过 node.data属性进行设置。 node.data: true 

  • 协调节点:协调 节点,只作为接收请求、转发请求到其他节点、汇总各个节点返回数据等功能的节点,均衡每个节点的负 载。 node.master: false ; node.data: false 

2. 分片(Shard)

一个索引中的数据保存在多个分片中,相当于水平分表。一个分片便是一个Lucene 的实例,它本身就是一个完整的搜索引擎。我们的文档被存储和索引到分片内,但是应用程序是直接与索引而不是与分片进行交互。

ES实际上就是利用分片来实现分布式。分片是数据的容器,文档保存在分片内,分片又被分配到集群内的各个节点里。当你的集群规模扩大或者缩小时, ES会自动的在各节点中迁移分片,使得数据仍然均匀分布在集群里。

一个分片可以是主分片或者副本分片。索引内任意一个文档都归属于一个主分片,所以主分片的数目决定着索引能够保存的最大数据量。一个副本分片只是一个主分片的拷贝。 副本分片作为硬件故障时保护数据不丢失的冗余备份,并为搜索和返回文档等读操作提供服务。

在索引建立的时候就已经确定了主分片数,但是副本分片数可以随时修改。默认情况下,一个索引会有5个主分片,而其副本可以有任意数量。

主分片和副本分片的状态决定了集群的健康状态。每一个节点上都只会保存主分片或者其对应的一个副本分片,相同的副本分片不会存在于同一个节点中。如果集群中只有一个节点,则副本分片将不会被分配,此时集群健康状态为yellow,存在丢失数据的风险。

3. 索引(Index)

Elastic 会索引所有字段,经过处理后写入一个反向索引(Inverted Index)。查找数据的时候,直接查找该索引。

所以,Elastic 数据管理的顶层单位就叫做 Index(索引)。它是单个数据库的同义词。每个 Index (即数据库)的名字必须是小写。

4. 文档(Document)

Index 里面单条的记录称为 Document(文档)。许多条 Document 构成了一个 Index。

Document 使用 JSON 格式表示,下面是一个例子。

{  "user": "张三",  "title": "工程师",  "desc": "数据库管理" }

同一个 Index 里面的 Document,不要求有相同的结构(scheme),但是最好保持相同,这样有利于提高搜索效率。

5. 类型(Type)

Document 可以分组,比如weather这个 Index 里面,可以按城市分组(北京和上海),也可以按气候分组(晴天和雨天)。这种分组就叫做 Type,它是虚拟的逻辑分组,用来过滤 Document。

不同的 Type 应该有相似的结构(schema),举例来说,id字段不能在这个组是字符串,在另一个组是数值。这是与关系型数据库的表的一个区别。性质完全不同的数据(比如products和logs)应该存成两个 Index,而不是一个 Index 里面的两个 Type(虽然可以做到)。

根据规划,Elastic 6.x 版只允许每个 Index 包含一个 Type,7.x 版将会彻底移除 Type。

6. 倒排索引(Inverted Index)

每一个文档都对应一个ID。倒排索引会按照指定语法对每一个文档进行分词,然后维护一张表,列举所有文档中出现的terms以及它们出现的文档ID和出现频率。搜索时同样会对关键词进行同样的分词分析,然后查表得到结果。

这里所述倒排索引是针对非结构化的文档构造的,而在ES中存储的文档是基于JSON格式的,因此索引结构会更为复杂。简单来说,ES对于JSON文档中的每一个field都会构建一个对应的倒排索引。

>>    想学大数据?点击找大叔! <<

智能人工推荐:

选方向?大数据的职位你了解多少

戏说数据中台 — 大佬玩概念,小弟写接口

在阿里一年,我颠覆了曾经坚信不疑的技术思维

Spark比MR快是因为在内存中计算?错!

觉得有价值请关注  

我来评几句
登录后评论

已发表评论数()

相关站点

+订阅
热门文章