跳至主要內容

Elasticsearch - 基础概念

Zenghr大约 4 分钟

Elasticsearch 介绍

在学习 Elasticsearch 之前,我们需要了解一下什么是Elasticsearch、以及它的一些基础概念

什么是 Elasticsearch

Elasticsearch 是一款非常强大的、基于 Lucene 的开源搜索及分析引擎;它是一个实时的分布式搜索分析引擎,它能让你以前所未有的速度和规模,去探索你的数据

Elasticsearch 的底层是开源库 Lucene。但是,你没法直接用 Lucene,必须自己写代码去调用它的 接口。Elastic 是 Lucene 的封装,提供了 REST API 的操作接口,开箱即用

为什么使用 Elasticsearch

根据DB Engine的排名 (opens new window)open in new window显示,ElasticSearch是最受欢迎的企业级搜索引擎。

nNGtOX
nNGtOX

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 中有这样的数据

idname
1我是中国人
2泱泱中华文化
32021 东京奥运会举办
4中国古诗文化
5中国古代历史

如果想要查询关于 中国 相关的信息,然后会开始遍历数据库,找到 1、4、5 记录

select * from table_name where name like '%中国%';

如果是倒排索引处理的话,首先会将每个名称进行分词,例如:我是中国人,会被分为 我、是、中国、人

然后关联信息的编号

termids
中国1、4、5
文化2、4

在倒排索引中搜索并发,然后进行检索,就很容易定位到关于 中国 相关的信息

参考资料