大数据学习(33)—— ElasticSearch简介
ES跟前面的大数据技术不一样,它不是apache的项目,官网是开源搜索:Elasticsearch、ELK
Elasticsearch 是什么
官方原话:Elasticsearch 是一个分布式的免费开源搜索和分析引擎,适用于包括文本、数字、地理空间、结构化和非结构化数据等在内的所有类型的数据。Elasticsearch 在 Apache Lucene 的基础上开发而成,于 2010 年首次发布。Elasticsearch 以其简单的 REST 风格 API、分布式特性、速度和可扩展性而闻名,是 Elastic Stack 的核心组件。
Elasticsearch 可以做什么
- 搜索网站:类似必应这样的搜索网站
- Stack Overflow:用来搜索技术问题和代码
- github:搜索开源项目
- 电商网站:搜索商品信息
- 日志分析:ELK擅长的领域
Elasticsearch 名词
索引(Index)
索引简单来说就是相似结构文档的集合,比如可以有一个客户索引,商品分类索引,订单索引。索引有一个名称,一个索引可以包含很多文档,一个索引就代表了一类相似的文档,比如说建立一个商品索引,里面可能就存放了所有的商品数据,也就是所有的商品文档。
ES的索引相当于关系型数据库中的“数据库”。
类型(Type)
在 6.0 之前,每一个索引是可以设置多个 Types 的,每个 Type 会拥有相同结构的文档,但是从 6.0 开始,Type 已经被废除。从 7.0 开始,一个索引只能创建一个 Type,也就是 _doc
。
ES的类型相当于关系型数据库中的“表”。
文档(Document)
ElasticSearch是面向文档的,文档是所有可搜索数据的最小单位。
ES的文档相当于关系型数据库中的“记录”。
在 ES 中文档会被序列化成 JSON 格式,保存在 ES 中,JSON 对象由字段组成,其中每个字段都有对应的字段类型(字符串/数组/布尔/日期/二进制/范围类型)。每个文档都有一个 Unique ID,可以自己指定 ID 或者通过 ES 自动生成。
集群(Cluster)
ES 集群是一个分布式系统,当集群中有节点服务停止响应的时候,整个服务还能正常工作。集群中有部分节点丢失的情况下,不会有数据丢失。
集群通过不同的名字来区分,默认的名字为 elasticsearch
,可以在配置文件中进行修改,或者在命令行中使用 -E cluster.name=xxxx
进行设定,一个集群中可以有一个或者多个节点。
ES 集群有三种颜色来表示健康程度:
- Green:主分片与副本都正常分配
- Yellow:主分片全部正常分配,有副本分片未能正常分配
- Red:有主分片未能分配(例如,当服务器的磁盘容量超过 85% 时,去创建了一个新的索引)
节点(Node)
节点其实就是一个 ES 实例,本质上是一个 Java 进程,一台机器上可以运行多个 ES 进程,但是生产环境一般建议一台机器上只运行一个 ES 实例。
每一个节点都有自己的名字,节点名称很重要(在执行运维管理操作的时候),可以通过配置文件进行配置,或者启动的时候 -E node.name=node1
指定。每一个节点在启动之后,会分配一个 UID,保存在 data 目录下。
默认节点会加入名称为 elasticsearch
的集群,如果直接启动很多节点,那么它们会自动组成一个 elasticsearch
集群,当然一个节点也可以组成一个 elasticsearch
集群。
分片(Shard)
由于单台机器无法存储大量数据,ES 可以将一个索引中的数据切分为多个分片(Shard),分布在多台服务器上存储。有了分片就可以横向扩展,存储更多数据,让搜索和分析等操作分布到多台服务器上去执行,提升吞吐量和性能。
一个 ES 索引包含很多分片,一个分片是一个 Lucene 的索引,它本身就是一个完整的搜索引擎,可以独立执行建立索引和搜索任务。
分片分为两类,一类为主分片(Primary Shard),另一类为副本分片(Replica Shard)。主分片主要用以解决水平扩展的问题,通过主分片,就可以将数据分布到集群上的所有节点上,一个主分片就是一个运行的 Lucene 实例,当我们在创建 ES 索引的时候,可以指定分片数,但是主分片数在索引创建时指定,后续不允许修改,除非使用 Reindex 进行修改。副本分片用以解决数据高可用的问题,也就是说集群中有节点出现硬件故障的时候,通过副本的方式,也可以保证数据不会产生真正的丢失,因为副本分片是主分片的拷贝,在索引中副本分片数可以动态调整,通过增加副本数,可以在一定程度上提高服务查询的性能。这就是HDFS分片和副本的概念。
概念对比
ES | RDBMS |
Index | DataBase |
Type(6.0以上版本弃用) | Table |
Document | Row |
Field | Column |
Mapping | Schema |
DSL | SQL |
与关系型数据库的区别
ElasticSearch支持灵活的单个对象存储和快速搜索查询。但是它的代价是延迟、缺少多表连接和事务。
- ES不支持原子事务,如果同时写多个索引,某处出现错误,不会回滚。
- ES写入数据后,需要1秒左右的时间才能被查询到。
- ES 没有 ORM,所以代码里基本上是查询的 JSON Query 满天飞,非常乱不说,还容易出错。
- ES是倒排索引,关系型数据库是Btree索引。所以ES是写入慢,读取快。关系型数据库是写入快,读取慢。
- ES对文档进行索引之前,文档必须先被反规范化,消除表关联以提升查询性能,但要保持数据一致性和实时性则更加困难。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能