Elasticsearch - 基础概念
Elasticsearch 介绍
在学习 Elasticsearch 之前,我们需要了解一下什么是Elasticsearch、以及它的一些基础概念
什么是 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 记录
select * from table_name where name like '%中国%';
如果是倒排索引处理的话,首先会将每个名称进行分词,例如:我是中国人,会被分为 我、是、中国、人
然后关联信息的编号
term | ids |
---|---|
中国 | 1、4、5 |
文化 | 2、4 |
在倒排索引中搜索并发,然后进行检索,就很容易定位到关于 中国 相关的信息