跳到主要内容

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

教程目录

基础阶段

进阶阶段

高级阶段

知识速查

学习建议

  1. 先理解概念:倒排索引、分片、副本是核心概念
  2. 动手实践:每学一个知识点都要实际操作
  3. 结合 Kibana:使用 Kibana Dev Tools 进行实验
  4. 阅读官方文档:官方文档是最权威的参考资料

版本说明

本教程基于 Elasticsearch 8.x 编写,主要特性包括:

  • 安全默认开启:自动配置安全认证
  • 向量搜索:原生支持 kNN 搜索
  • 简化的 API:移除已废弃的特性
  • 性能提升:索引和查询性能优化

参考资源

准备好开始学习了吗?点击下一章开始你的 Elasticsearch 之旅!