【每日五分钟学习大数据】系列 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
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快是因为在内存中计算?错! 觉得有价值请关注 ▼