Elasticsearch 教程
欢迎学习 Elasticsearch!本教程将带你从零基础开始,逐步掌握 Elasticsearch 的核心知识和技能。
什么是 Elasticsearch?
Elasticsearch 是一个基于 Apache Lucene 构建的分布式、RESTful 风格的搜索和数据分析引擎。它被广泛应用于:
- 全文搜索:网站搜索、商品搜索、文档检索
- 日志分析:ELK Stack 的核心组件,用于日志收集和分析
- 监控指标:应用性能监控、基础设施监控
- 安全分析:安全事件分析、威胁检测
核心特点
┌─────────────────────────────────────────────────────────────┐
│ Elasticsearch 核心特点 │
├─────────────────────────────────────────────────────────────┤
│ ✓ 分布式 - 天然支持集群,自动分片和副本 │
│ ✓ 近实时 - 文档索引后约 1 秒即可搜索到 │
│ ✓ RESTful API - 使用 JSON 进行通信,简单易用 │
│ ✓ 高可用 - 自动故障检测和恢复 │
│ ✓ 可扩展 - 水平扩展,支持 PB 级数据 │
│ ✓ 多语言 - 支持 Java、Python、JavaScript 等客户端 │
└─────────────────────────────────────────────────────────────┘
核心概念
与关系型数据库对比
| Elasticsearch | 关系型数据库(MySQL) | 说明 |
|---|---|---|
| Index(索引) | Database(数据库) | 存储相关文档的容器 |
| Type(类型) | Table(表) | 已废弃,7.x 后一个索引只有一个类型 |
| Document(文档) | Row(行) | 最小数据单元,JSON 格式 |
| Field(字段) | Column(列) | 文档中的属性 |
| Mapping(映射) | Schema(表结构) | 定义字段类型和索引方式 |
| Shard(分片) | Partition(分区) | 水平分割数据 |
| Replica(副本) | Slave(从库) | 数据备份,提高可用性 |
文档(Document)
文档是 Elasticsearch 中的最小数据单元,以 JSON 格式存储:
{
"id": 1,
"title": "Elasticsearch 入门教程",
"content": "本文介绍 Elasticsearch 的基本概念和使用方法",
"author": "张三",
"views": 1000,
"tags": ["elasticsearch", "搜索", "教程"],
"created_at": "2024-01-15T10:30:00"
}
索引(Index)
索引是文档的逻辑容器,类似于数据库:
索引: articles
├── 文档 1: { "title": "文章1", ... }
├── 文档 2: { "title": "文章2", ... }
└── 文档 3: { "title": "文章3", ... }
分片和副本
索引: articles (3 个主分片,每个主分片 1 个副本)
┌─────────────────────────────────────────────────────────────┐
│ Elasticsearch 集群 │
├─────────────────────────────────────────────────────────────┤
│ 节点1 节点2 节点3 │
│ ┌─────┐ ┌─────┐ ┌─────┐ │
│ │ P0 │ │ P1 │ │ P2 │ 主分片 │
│ │ R1 │ │ R2 │ │ R0 │ 副本分片 │
│ └─────┘ └─────┘ └─────┘ │
└─────────────────────────────────────────────────────────────┘
P0, P1, P2 = 主分片(Primary Shard)
R0, R1, R2 = 副本分片(Replica Shard)
解释:
- 主分片:存储原始数据,写操作只能在主分片进行
- 副本分片:主分片的复制,用于读操作和故障恢复
- 分片数量在创建索引时确定,之后不能修改
映射(Mapping)
映射定义了文档的结构和字段类型:
{
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "ik_max_word"
},
"author": {
"type": "keyword"
},
"views": {
"type": "integer"
},
"created_at": {
"type": "date"
}
}
}
}
倒排索引
Elasticsearch 使用倒排索引实现快速全文搜索。
正向索引 vs 倒排索引
正向索引(传统数据库):
文档 ID -> 文档内容
文档1: "Elasticsearch 是搜索引擎"
文档2: "搜索引擎是重要工具"
文档3: "Elasticsearch 功能强大"
查询包含 "搜索引擎" 的文档:
需要扫描所有文档 -> 效率低
----------------------------------------
倒排索引(Elasticsearch):
词项 -> 文档 ID 列表
词项 文档 ID
--------------------------
elasticsearch -> [1, 3]
搜索引擎 -> [1, 2]
是 -> [1, 2]
工具 -> [2]
功能 -> [3]
强大 -> [3]
查询包含 "搜索引擎" 的文档:
直接查找词项 -> 得到 [1, 2] -> 效率高
倒排索引结构
┌─────────────────────────────────────────────────────────────┐
│ 倒排索引结构 │
├─────────────────────────────────────────────────────────────┤
│ Term Dictionary(词典) │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Term │ Doc IDs │ Term Frequency │ │ │
│ ├─────────────┼──────────────┼────────────────┤ │ │
│ │ elasticsearch │ [1, 3] │ [2, 1] │ │ │
│ │ 搜索引擎 │ [1, 2] │ [1, 1] │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ Posting List(倒排表) │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Doc ID │ Position │ Offset │ │ │
│ ├────────┼──────────┼────────┤ │ │
│ │ 1 │ [1] │ [...] │ │ │
│ │ 2 │ [0] │ [...] │ │ │
│ └─────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
RESTful API
Elasticsearch 提供 RESTful API,使用 HTTP 方法进行操作:
| HTTP 方法 | 用途 | 示例 |
|---|---|---|
| GET | 获取数据 | GET /articles/_doc/1 |
| POST | 创建/更新数据 | POST /articles/_doc |
| PUT | 创建/替换数据 | PUT /articles/_doc/1 |
| DELETE | 删除数据 | DELETE /articles/_doc/1 |
| HEAD | 检查存在 | HEAD /articles/_doc/1 |
教程目录
基础阶段
进阶阶段
高级阶段
知识速查
- 速查表 - 常用 API 和命令速查
学习建议
- 先理解概念:倒排索引、分片、副本是核心概念
- 动手实践:每学一个知识点都要实际操作
- 结合 Kibana:使用 Kibana Dev Tools 进行实验
- 阅读官方文档:官方文档是最权威的参考资料
版本说明
本教程基于 Elasticsearch 8.x 编写,主要特性包括:
- 安全默认开启:自动配置安全认证
- 向量搜索:原生支持 kNN 搜索
- 简化的 API:移除已废弃的特性
- 性能提升:索引和查询性能优化
参考资源
准备好开始学习了吗?点击下一章开始你的 Elasticsearch 之旅!