什么是 Elasticsearch?都要学什么?傻子可懂,一个视频讲清楚
·
什么是 Elasticsearch?都要学什么?傻子可懂,一个视频讲清楚
一、为什么需要 Elasticsearch?
- 场景问题:后端程序员使用传统数据库(如 MySQL)实现文章搜索功能时,用户投诉搜索效果差(如搜索“鱼皮教程”无法匹配“鱼皮的ES入门教程”)。
- 核心痛点:传统数据库的
LIKE查询无法实现灵活、高效的全文检索。 - 解决方案:引入 Elasticsearch(ES),一个专为搜索设计的分布式数据库(搜索引擎数据库)。
- 核心优势:
- 存储和管理海量文本数据
- 提供快速、准确、灵活的全文检索能力
- 支持全文搜索、数据分析等场景
二、Elasticsearch 基础概念
1. 核心类比
- 传统数据库(如 MySQL):像图书馆书架,需手动逐排查找书籍。
- Elasticsearch:像图书馆电子检索系统,输入关键词即可快速定位并按相关性排序。
2. 关键术语
| 术语 | 说明 |
|---|---|
| 索引(Index) | 类似数据库中的表,存放数据的容器。创建时需定义映射(Mapping),类似表结构。 |
| 文档(Document) | 类似表中的一行数据,使用 JSON 格式存储,无需预定义字段,动态灵活。 |
| 字段(Field) | 文档中的数据属性,可指定类型(如 text、keyword)及分词器。 |
| 映射(Mapping) | 定义索引中字段的数据类型、分词规则等(如使用 IK 分词器)。 |
三、快速上手:安装与操作
1. 安装与可视化工具
- ES 安装:
- 官网下载安装包,运行后默认通过 9200 端口提供 RESTful API。
- 操作方式:
curl命令、Postman 等工具发送 HTTP 请求。
- 可视化工具 Kibana:
- 官网下载安装,运行后访问 5601 端口。
- 功能:直观查看/分析数据,在 开发工具(Dev Tools) 控制台直接执行查询语句。
2. 基本操作(Kibana Dev Tools)
// 1. 创建索引(定义映射)
PUT /article
{
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "ik_max_word" // 使用 IK 分词器
},
"content": { "type": "text" }
}
}
}
// 2. 插入文档
POST /article/_doc/1
{
"title": "鱼皮的ES入门教程",
"content": "本文讲解ES基础..."
}
// 3. 搜索文档(全文检索)
GET /article/_search
{
"query": {
"match": {
"title": "鱼皮教程" // 即使标题无完整词,也能匹配(分词后匹配)
}
}
}
3. 核心查询语法(DSL)
- DSL(Domain Specific Language):ES 的 JSON 格式查询语言。
- 常用查询类型:
match:全文检索(分词后匹配)。term:精确匹配(不分词)。bool:组合多条件(must、should、must_not)。range:范围查询(如日期、数值范围)。
- 学习建议:无需死记语法,结合文档或 AI 工具实践即可。
四、核心原理:为什么 ES 搜索快又准?
1. 倒排索引(Inverted Index)
- 原理:
- 分词:将文档内容切分为单词(如“鱼皮的ES入门教程” → “鱼皮”、“ES”、“入门”、“教程”)。
- 建索引:建立 单词 → 文档ID 的映射关系。
- 查询流程:
- 对搜索词分词(如“鱼皮教程” → “鱼皮”、“教程”)。
- 通过倒排索引快速定位包含这些词的文档。
- 对比传统数据库:无需逐行扫描,效率大幅提升。
2. 分词器(Analyzer)
- 作用:决定文本如何被切分。
- 内置分词器:
- Standard Analyzer:按空格/标点切分(适合英文,中文效果差)。
- 中文分词器:IK Analyzer
- ik_smart:智能分词(粗粒度,如“程序员”不拆分)。
- ik_max_word:最细粒度分词(如“程序员”→“程序”、“员”)。
- 推荐用法:
- 索引时用
ik_max_word(最大化召回率)。 - 搜索时用
ik_smart(提升精确度)。
- 索引时用
- 自定义词典:添加专有名词(如“鱼皮”)避免被错误拆分。
五、高级功能
1. 高亮显示(Highlight)
- 作用:在搜索结果中标记匹配的关键词。
- 实现方式:
GET /article/_search { "query": { "match": { "title": "鱼皮" } }, "highlight": { "fields": { "title": {} } // 指定高亮字段 } } - 返回结果:匹配词被
<em>标签包裹,前端可自定义样式。
2. 相关性排序(BM25 算法)
- 评分因子:
- 词频(TF):关键词在文档中出现次数越多,分数越高。
- 文档长度:关键词在短文档中占比更大,分数更高。
- 逆文档频率(IDF):关键词在所有文档中越罕见,分数越高。
- 结果:分数(
_score字段)越高,排序越靠前。
3. 聚合分析(Aggregation)
- 作用:类似 SQL 的
GROUP BY,支持数据统计与分析。 - 常见类型:
- Terms 聚合:按字段值分组统计(如统计各标签的文章数)。
- Metric 聚合:求和/平均值/最大值等(如计算平均阅读量)。
- 嵌套聚合:多层分组统计(如按标签分组后,再按发布日期分组)。
- 示例:
GET /article/_search { "size": 0, "aggs": { "tags_count": { "terms": { "field": "tags.keyword" } } } }
六、生产环境实践
1. 数据同步方案(ES 与 MySQL)
| 方案 | 原理 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| 定时任务 | 定期扫描 MySQL 更新数据同步到 ES | 实现简单 | 有延迟(分钟级) | 低实时性需求 |
| 双写(Dual Write) | 写 MySQL 时同步写 ES | 实时同步 | 降低写入性能;需处理 ES 写入失败 | 写入量小 |
| Logstash | 配置 Logstash 从 MySQL 拉取数据同步到 ES | 无需编码 | 需额外组件;灵活性有限 | 简单同步需求 |
| Canal | 监听 MySQL Binlog,实时同步变更 | 高实时性 | 部署复杂 | 高实时性要求(如电商) |
2. 集群架构设计
- 节点类型:
- Master 节点:管理集群状态(节点、元数据)。
- Data 节点:存储数据、处理读写请求。
- 高可用要求:
- 生产环境至少 3 个节点(避免单点故障)。
- 启用 副本(Replica):每个分片创建副本存储于其他节点,数据不丢失,服务不中断。
- 分片(Shard)机制:
- 作用:将索引数据拆分为多份,分布到不同节点。
- 优势:突破单节点存储限制,并行处理提升性能。
- 配置:创建索引时指定分片数和副本数(如 5 分片 + 1 副本)。
七、进阶学习路径
1. 核心问题驱动学习
- ES 为什么快?
- 倒排索引优化(基于 Lucene 引擎)。
- 内存缓存常用数据(优先内存读取)。
- 分布式并行处理(多节点协同查询)。
- 数据写入流程? → 了解 Lucene 的段(Segment)合并机制。
- 查询执行流程? → 理解协调节点(Coordinating Node)的分发策略。
2. 推荐学习资源
- 官方文档:版本迭代快,文档最权威(https://www.elastic.co/guide)。
- 面试题:通过高频题目掌握核心知识点(如倒排索引、分片原理、数据同步方案)。
- 动手实践:
- 搭建 ES + Kibana 环境。
- 实现中文搜索(配置 IK 分词器)。
- 同步 MySQL 数据(尝试定时任务或 Canal)。
- 性能调优(监控集群状态、优化查询语句)。
八、总结
- ES 定位:分布式全文搜索引擎,解决传统数据库搜索效率低、灵活性差的问题。
- 核心能力:倒排索引、分词器、相关性排序、聚合分析。
- 生产关键:数据同步方案、集群高可用(分片+副本)、性能调优。
- 学习建议:
“ES 是实战型技术,一定要多动手实践!”
—— 从基础操作到集群部署,通过项目深化理解。
更多推荐
所有评论(0)