前言
随着本人所在小组每周的技术分享,本人决定将每周所学整理为学习笔记,以供自己牢固知识。同时希望对新玩家有引导作用,也希望老玩家能就我之所学错误之处批评指正,不甚感激。
本人的学习方法:争取在系列学习之前给自己提几个问题,随着学习的深入可以贯穿始终,从顶层到底层的回答系列学习前问题。私以为,徐徐图之,便可进至大成。
Elasticsearch 简单介绍
ES是一个基于RESTful web接口并且构建在Apache Lucene之上的开源分布式搜索引擎。
同时ES还是一个分布式文档数据库,其中每个字段均可被索引,而且每个字段的数据均可被搜索,能够横向扩展至数以百计的服务器存储以及处理PB级的数据。
可以在极短的时间内
存储、搜索和分析大量的数据。通常作为具有复杂搜索场景情况下的核心发动机。
划关键词:
- 搜索引擎
这正是es区别于其他nosql数据库的地方,其他 nosql 数据库更注重于“数据库”的特性,即更偏向于均衡存储和搜索的性能,并在acid中做取舍。但es更注重于更快、更方便的“搜索”(所以自然牺牲了增删改的效率,这也是为什么es没那么“数据库”),虽然也是把数据存储在节点内,但是相比于单独将 es 作为数据库用,日常更倾向于将 es + 数据库的方案。 - 分布式文档数据库
这里重点为:分布式、文档数据库。其中分布式是由 es 分配分片算法、选举算法……等等构成的。文档数据库很好理解,可以存储no-schema的 json 文档型数据。 - 索引
这里的索引是指物理索引,在整个 es 的学习过程中,可能会混淆物理索引和逻辑索引,两者之间的区别,要多多注意。 - 极短的时间内
存储、搜索和大量分析
与普通的nosql数据库相比,极短时间的搜索和大量分析是正确的说法,但存储可能有失偏颇,这是 es 存储数据的数据结构决定的,es 注定要牺牲添加数据的效率,来换取查询的效率和准确性。
逻辑设计:索引、类型、文档
所谓逻辑设计是指,这里的索引、类型、文档只是逻辑归类概念,数据的物理存放(磁盘或内存中),数据结构不同的。
举例理解:
现有一堆糖果和两个盒子摆在面前,糖果分为两类:水果糖和果仁糖。每个盒子里面各放一半的水果糖与果仁糖。这样,每个盒子各里有一半的水果糖和果仁糖。
其中:盒子可以理解为分片,糖的类别可以理解为类型,所有的糖都是属于一个叫“糖”的索引。
索引(index)
索引在 es 中的作用,可以类比为关系数据库中的数据库,如果是项目区别,命名一般为项目名称。如果是作为日志管理系统,一般为日期。可以在索引中设置字段(key)与类型的映射。
另:索引中类型的字段类型是无法在索引数据后修改的,所以需要在有数据前,设置好 index 的字段-类型的映射。
类型(type)
es 设计之关键。es 中的类型概念可以类比为关系数据库中的 “表” ,在关系数据库中表关系与表中的字段为设计之关键,所以在 es 中,类型也为数据管理逻辑设计的关键。
一般在不同的类型中,存放结构不同的数据。
文档(document)
Json格式的数据文档,物理保存在每一个分片中,逻辑组织在每一个类型中。
物理设计:分片、节点
所位物理设计是指实际数据的存储位置(当然,也是相对抽象的),es 中的文档默认均匀分布在所有主分片中,并实时同步到副分片中。由于 es 数据的物理组织形式,与其拥有的集群选举算法,es 可以说是天生的分布式搜索引擎。
分片(shared)
分片是存储文档的基本单元。也是数据从一个节点迁移向另一个节点的最小单元。
分片分为主分片与副分片,默认地,es 会有5个主分片,每个主分片篇拥有一个副分片(可能会随版本不同而不同)。当然,我们可以在 es 的配置中自行配置分片数量。
节点
每一个运行的 es 示例我们就可以称之为一个节点,多个节点配置在一起,我们称之为 es集群。
ES如何索引(添加)文档?
默认的,文档再分片中均匀分布:决定每篇文档的分片是由每篇文档ID的散列值决定的。每个分片有相同的散列范围,所以接收机会均等。一旦分片确定,接受请求的节点将文档转发至目标分片所在节点并保存。随后,在该分片的副分片中索引文档。
ES如何搜索文档?
节点接收搜索请求后,节点将请求转发给包含所有数据的最小分片集合,使用轮询机制在主副分片中选择可用分片,搜索后节点聚合结果,返回给客户端。
问题1:为什么能快速的、方便的搜索?
答:目前来看,es 的分片存储机制能够很好的增益搜索性能。而如何让搜索更准确、更快速,在下一篇中会着重整理倒排索引、评分和分词器的概念。
参考资料:
《Elasticsearch 实战》