什么是 Elasticsearch
Elasticsearch 是一款非常强大的、基于 Lucene 的开源搜索及分析引擎;它是一个实时的分布式搜索分析引擎,它能让你以前所未有的速度和规模,去探索你的数据
Elasticsearch 的底层是开源库 Lucene。但是,你没法直接用 Lucene,必须自己写代码去调用它的 接口。Elastic 是 Lucene 的封装,提供了 REST API 的操作接口,开箱即用
为什么使用 Elasticsearch
根据DB Engine的排名 (opens new window)显示,ElasticSearch是最受欢迎的企业级搜索引擎。

Elasticsearch 的特点
ES 是分布式文档存储,存储的数据都是序列化为 JSON documents
使用倒排索引存储数据,倒排索引比较适合全文本搜索
支持 JSON 样式的查询语言 —— Query DSL,也支持 SQL 样式的查询
主要功能以及使用场景
应用场景
记录和日志分析
采集和组合公共数据
全文搜索及个性化推荐
事件数据和指标
数据可视化
举例:
维基百科:全文检索,高亮,搜索推荐等等
GitHub:上千亿行的代码搜索
电商网站:搜索商品
日志数据分析:logstash采集数据,ES进行数据分析处理
商品价格监控网站:用户设定某商品的价格阈值,当监控到商品的金额低于这个阈值的时候,就发送消息通知用户
Elasticsearch 的基础概念
使用 Elasticsearch 之前,先了解一下 Elasticsearch 的概念
索引(Index)
Elasticsearch 把数据存放到一个或者多个索引(indices)中。如果用关系型数据库模型对比,索引(index) 的地位与数据库实例(database)相当。
动词:相当于 MySQL 中的 insert 动作
名词:相当于 MySQL 中的 Database
类型(Type)
指在一个索引中,可以索引不同类型的文档,如用户数据、博客数据。
从6.0.0 版本起已废弃,一个索引中只存放一类数据
7.0 弃用了接受类型的 API,引入了新的无类型 API
如果你的 Elasticsearch 是 7.0 以上,就可以不用了解 Type 了
文档(Document)
保存在某个索引(Index)下,某种类型(Type)的一个数据(Document),文档是 JSON 格式的,Document 就像是 MySQL 中的某个 Table 里面的内容
集群相关
Cluster 集群,一个集群由一个唯一的名字标识,默认为“elasticsearch”。集群名称非常重要,具有相同集群名的节点才会组成一个集群。集群名称可以在配置文件中指定。
Node 节点:存储集群的数据,参与集群的索引和搜索功能。像集群有名字,节点也有自己的名称,默认在启动时会以一个随机的UUID的前七个字符作为节点的名字,你可以为其指定任意的名字。通过集群名在网络中发现同伴组成集群。一个节点也可是集群
Shard 分片:在创建一个索引时可以指定分成多少个分片来存储。每个分片本身也是一个功能完善且独立的“索引”,可以被放置在集群的任意节点上。
Replication 备份: 一个分片可以有多个备份(副本)
倒排索引
倒排索引也可以称为反向索引
我们平时存储数据用的 mysql,采用的是正向索引,例如 mysql 中有这样的数据
id | name |
|---|---|
1 | 我是中国人 |
2 | 泱泱中华文化 |
3 | 2021 东京奥运会举办 |
4 | 中国古诗文化 |
5 | 中国古代历史 |
如果想要查询关于 中国 相关的信息,然后会开始遍历数据库,找到 1、4、5 记录
SQL
select * from table_name where name like '%中国%';
如果是倒排索引处理的话,首先会将每个名称进行分词,例如:我是中国人,会被分为 我、是、中国、人
然后关联信息的编号
term | ids |
|---|---|
中国 | 1、4、5 |
文化 | 2、4 |
在倒排索引中搜索并发,然后进行检索,就很容易定位到关于 中国 相关的信息