1. Elasticsearch入门:ES发展史、ES核心概念、ES应用场景、ES与关系型数据库对比
大家好,我是你们的老朋友。今天咱们正式开启Elasticsearch的学习之旅。说实话,我第一次接触ES是在2015年,当时公司日志系统扛不住了,MySQL查个日志要等半天。后来用了ES,查询速度从分钟级降到了毫秒级——那种感觉,就像从绿皮火车直接换成了高铁。
这一章是入门基础,我会把ES的来龙去脉、核心概念、能干什么、跟MySQL比有什么不同,一次性讲清楚。你不需要记住所有细节,但一定要理解ES的设计哲学——它为什么快?它适合解决什么问题?
1.1 ES发展史:从开源搜索到数据中枢
Elasticsearch的诞生,其实挺有意思的。2004年,有个叫Shay Banon的哥们,他妻子想学做菜,他就写了个搜索菜谱的应用叫Compass。后来他觉得Compass太笨重,干脆重写了一个——这就是ES的雏形。
2010年,第一个公开版本发布。我记得当时很多人不看好,觉得一个搜索框架能翻出什么浪?结果呢?
- 2012年:成立Elastic公司,开始商业化
- 2015年:成为GitHub上最火的搜索项目之一
- 2018年:纽交所上市,市值一度超过50亿美元
- 2021年:与Elasticsearch B.V.合并,推出Elastic Stack(ELK全家桶)
现在ES已经不只是搜索引擎了。它成了日志分析、指标监控、安全分析、甚至向量检索的通用平台。我见过最夸张的案例——某电商用ES做商品推荐,每天处理10亿+请求,延迟控制在20ms以内。
核心启示:ES的成功,在于它把「搜索」这件事做到了极致,然后围绕搜索构建了一个完整的生态。你想想看,从日志到APM,从安全到AI,底层都是搜索。
1.2 ES核心概念:索引、文档、分片、副本
这部分是ES的基石。我建议你反复看,因为后面所有操作都基于这些概念。
1.2.1 索引(Index)
索引,说白了就是「一类文档的集合」。你可以把它类比成MySQL里的数据库。比如你有一个电商系统,商品数据放一个索引,订单数据放另一个索引。
但ES的索引更灵活。它支持动态映射——你不需要提前定义字段类型,ES会自动推断。嗯,这里要注意:生产环境千万别依赖动态映射,我踩过坑——有一次线上ES集群突然写入变慢,查了半天,发现是某个字段被动态映射成了text类型,导致索引膨胀了3倍。
# 创建一个名为products的索引
PUT /products
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1
}
}
1.2.2 文档(Document)
文档是ES里最小的数据单元。它本质上是一个JSON对象。比如一条商品记录:
{
"product_id": "P1001",
"name": "iPhone 15 Pro",
"price": 8999.00,
"tags": ["手机", "苹果", "旗舰"]
}
每个文档都有一个唯一的_id。你可以自己指定,也可以让ES自动生成。我个人习惯用业务ID作为文档ID,这样方便后续更新和删除。
1.2.3 分片(Shard)
分片是ES实现分布式存储的关键。一个索引的数据会被拆成多个分片,分散到不同节点上。为什么这么做?
- 水平扩展:数据量大了,加节点就行,分片会自动重新分配
- 并行查询:一个查询可以同时跑在多个分片上,速度翻倍
分片数量在创建索引时就要定好。我建议:
- 每个分片大小控制在20-40GB
- 分片总数不要超过节点数的10倍
- 生产环境至少2个分片起步
避坑指南:我曾经接手过一个项目,索引分了100个分片,但只有3个节点。结果每个节点上堆了30多个分片,查询性能反而比不分片还差。记住:分片不是越多越好,要跟节点数匹配。
1.2.4 副本(Replica)
副本就是分片的备份。每个分片可以有一个或多个副本。副本的作用:
- 高可用:主分片挂了,副本顶上
- 提升读性能:查询可以同时从主分片和副本读取
默认情况下,每个分片有一个副本。我建议生产环境至少保留1个副本。但要注意:副本越多,写入性能会下降,因为每个副本都要同步数据。
1.3 ES应用场景:它能解决什么问题?
ES的应用场景,我总结为三大类:
| 场景 | 典型例子 | 为什么用ES |
|---|---|---|
| 全文搜索 | 电商商品搜索、站内搜索 | 支持中文分词、模糊匹配、高亮显示 |
| 日志分析 | ELK日志平台、APM监控 | 海量数据写入、实时聚合分析 |
| 指标监控 | 系统监控、业务指标看板 | 支持时间序列、聚合计算、可视化 |
我见过最典型的案例:某金融公司用ES做风控系统。每天处理5000万笔交易,实时检测异常行为。如果发现某账户短时间内频繁交易,ES能在100ms内触发告警。换成传统数据库?等查完数据,钱早转走了。
个人经验:如果你遇到「数据量大、查询条件复杂、要求毫秒级响应」的场景,优先考虑ES。但如果你的业务是「频繁更新、强事务、复杂关联查询」,那还是老老实实用关系型数据库。
1.4 ES与关系型数据库对比
很多初学者会问:ES能替代MySQL吗?我的回答是:不能,也不应该。它们的设计目标完全不同。
| 对比维度 | Elasticsearch | 关系型数据库(如MySQL) |
|---|---|---|
| 数据模型 | 文档型(JSON) | 关系型(表、行、列) |
| 查询方式 | RESTful API + DSL | SQL |
| 事务支持 | 不支持(最终一致性) | 支持ACID |
| 扩展方式 | 水平扩展(加节点) | 垂直扩展为主 |
| 写入性能 | 高(近实时) | 中等 |
| 查询性能 | 高(倒排索引) | 中等(B+树索引) |
| 适用场景 | 搜索、日志、分析 | OLTP、事务处理 |
你想想看,为什么ES写入快?因为它用的是倒排索引。传统数据库存的是「文档→关键词」的映射,而ES存的是「关键词→文档」的映射。搜索时直接定位关键词,不需要全表扫描。
但ES也有短板。它不支持事务,没有外键约束,更新操作是「先删后写」。所以,我建议的架构是:
- MySQL:负责核心业务数据,保证事务一致性
- ES:负责搜索和分析,提升查询体验
- 两者通过同步机制(如Canal、Logstash)保持数据一致
一句话总结:ES不是MySQL的替代品,而是互补品。用MySQL存数据,用ES搜数据——这才是最佳实践。
好了,第一章的内容就到这里。你可能会觉得概念有点多,没关系,后面每一章都会反复用到这些概念。下一章我们直接上手,安装ES并跑通第一个搜索请求。到时候你会发现,这些概念其实没那么抽象。
公众号:蓝海资料掘金营,微信deep3321