1. 什么是ElasticSearch
ElasticSearch是一个开源的基于 RESTful 的分布式搜索和分析引擎
日常中见到的各个软件搜索界面基本上都基于ElasticSearch,如淘宝、京东、美团等,他可以根据关键字和空间位置进行分析搜索
2. 为什么要使用ElasticSearch
2.1 ElasticSearch与其他数据库的区别
2.1.1 传统关系型数据库的缺点:
-
传统关系型数据库在数据量过大的情况下(PB级别)查询效率低下,模糊匹配的过程中可能导致全表扫描
-
MySQL全文索引不支持分词器
2.1.2 传统关系型数据库的优点:
-
数据一致性较好,易于处理事务
-
数据更新的开销较好
-
可以进行Join等复杂查询
2.1.3 ElasticSearch的优势:
-
适合在海量数据(PB级)场景下快速搜索
-
可拓展性强,天生适合分布式
-
可支持全文搜索
-
支持多种数据类型,ElasticSearch可以支持多种数据类型,比如文本、数字、日期、地理位置等
-
易于使用和继承,因为ElasticSearch基于 REST API
2.1.4 ElasticSearch的缺点:
-
学习曲线较陡峭
-
硬件要求较高,需要大量存储空间和内存
-
由于是分布式系统,可能存在数据一致性问题
2.2 ElasticSearch的数据结构及架构
2.2.1 ElasticSearch的数据结构
-
Index(索引):定义了一个类型的数据,一个索引中的数据特征较为相近,可以将Index理解为MySQL当中的数据库中的表
-
Type(字段类型):定义数据结构,ES 7.0 之后一个索引只能创建一个Type,8.0之后被完全删除,因为在MySQL中不同表的相同的列是不会相互关联的,但在ES当中不是如此,因此在8.0之后被弃用,Index从类似于MySQL数据库的地位转变为更类似于表的地位
-
Document(文档):保存最终数据,一个文档就等价于MySQL中的一行数据,是ES中最小的数据单元
-
Mapping(映射):定义Index的结构,类似于MySQL中定义表结构
-
Field(字段):定义了一个Index当中某种数据的某个参数,类似于MySQL当中的某个表的某一列
-
Shard(分片):ES 可以将一个Index分割成多个Shard类似于数据库中的横向分表,这样可以提高整体的性能和吞吐量
-
replica(副本):一种容灾机制,对分片进行备份,防止丢失
-
Node(节点):一台 ES 服务器就是一个节点
-
Cluster(集群):多个Node组成了一个集群
-
DSL(查询语言):基于JSON的查询语言,类似于SQL语句
ES | MySQL |
---|---|
Index(索引) | Table(表) |
Document(文档) | Row(行数据) |
Field(字段) | Column(列) |
Mapping(映射) | Schema(约束) |
2.2.2 架构图
集群样式
3. 倒排索引
倒排索引也叫做反向索引,可以用于提高检索速度的数据结构,缺点是对硬件的要求较高。
其核心点是通过分词器将文档分成多个词条,然后将文档的ID与关键词相关联,这样词条将会关联一个列表,列表中存放了存在该词条的文档ID,再将词条通过字典二叉树的格式放在内存中。在查询的时候首先在内存中找到词条,再更具关键词找到相关文档ID。
- 词条(Term):对文档数据或用户搜索内容,利用分词器得到多个有具体含义的词语
- 词典(Term Dictionary):Term的集合
倒排索引架构(图片来源:https://segmentfault.com/a/1190000037658997)