ElasticSearch 核心概念
内容:是什么 -> 怎么存 -> 怎么查 -> 怎么扩 -> 为什么这样设计。
Elasticsearch 是一个基于 Lucene 的分布式搜索与分析引擎, 用于 全文检索、结构化查询、聚合分析、日志与指标分析。
核心特点
- 分布式(天然集群)
- Near Real Time(准实时)
- Schema-on-write(写入时建结构)
- 面向文档(JSON)
- 高可扩展、高并发读
Index(索引)
└── Shard(分片)
└── Segment(段)
└── Document(文档)
└── Field(字段)
- 类似 数据库
- 一类数据的集合
- mapping 在这里定义
index = 表结构 + 数据集合
- ES 的最小数据单元
- JSON 格式
- 类似一行记录
{
"id": 1,
"title": "ElasticSearch",
"content": "全文检索引擎"
}
- 文档中的属性
- 有类型(text / keyword / date / long)
Mapping 决定了数据如何被索引和搜索
常见字段类型
| 类型 | 用途 |
|---|---|
| text | 全文检索 |
| keyword | 精确匹配 / 聚合 |
| long / integer | 数值 |
| date | 时间 |
| boolean | 布尔 |
| object / nested | 对象 |
text vs keyword(必考)
| 对比 | text | keyword |
|---|---|---|
| 是否分词 | 是 | 否 |
| 是否支持聚合 | ❌ | ✅ |
| 场景 | 搜索 | 过滤 / 排序 |
什么是倒排索引?
传统:
文档 -> 内容
倒排:
词 -> 文档列表
示例
| 文档 | 内容 |
|---|---|
| doc1 | I love ES |
| doc2 | I love you |
倒排索引:
I -> doc1, doc2
love -> doc1, doc2
ES -> doc1
you -> doc2
👉 搜索速度极快
分词器组成
Character Filter -> Tokenizer -> Token Filter
常见分词器
| 分词器 | 说明 |
|---|---|
| standard | 默认 |
| ik_smart | 中文 |
| ik_max_word | 中文 |
| keyword | 不分词 |
- Primary Shard:写入主分片
- Replica Shard:提高可用性 & 读性能
写 -> 主分片 -> 同步到副本
- 分片数创建后不能改
- 分片是最小调度单位
- 查询是 shard 级并行
| 指标 | 建议 |
|---|---|
| 单分片大小 | 10~50GB |
| 分片总数 | ≤ 节点 × 2~3 |
Client
↓
协调节点
↓
Primary Shard
↓
Replica Shard
↓
Refresh(生成 segment)
关键点
- 写入成功 ≠ 可搜索
- refresh 后才能被查到
- 默认 1s refresh
Client
↓
协调节点
↓
所有相关 Shard 并行查询
↓
合并排序
↓
返回结果
两阶段查询
- Query Phase(匹配 + 打分)
- Fetch Phase(取文档)
为什么不是实时?
- 写入 -> buffer
- refresh -> segment
- search 只查 segment
👉 1 秒延迟换高吞吐
ES 的实时分析能力
类型
- Metric:sum / avg / max
- Bucket:terms / date_histogram
- Pipeline:对聚合结果再聚合
特点
- 基于倒排 + doc_values
- 内存消耗大(需谨慎)
常见节点角色
| 角色 | 职责 |
|---|---|
| master | 集群元数据 |
| data | 存储和搜索 |
| ingest | 预处理 |
| coordinating | 请求路由 |
- 默认 最终一致性
- 写入副本后才返回
- 网络异常可能短暂不一致
| 维度 | ES | 数据库 |
|---|---|---|
| 核心能力 | 搜索 | 事务 |
| 一致性 | 弱 | 强 |
| Join | 不擅长 | 强 |
| 更新 | delete + insert | in-place |
| 扩展 | 天然分布式 | 较难 |
- 倒排索引 -> 快
- 分片 -> 扩展
- NRT -> 吞吐
- 弱一致 -> 高可用
ES 用一致性换性能,用空间换时间
十五、总结
Elasticsearch 是一个基于 Lucene 的分布式搜索引擎, 以文档为单位,通过倒排索引实现快速搜索, 通过分片实现水平扩展, 通过副本保证高可用, 是一个准实时、弱一致、以搜索和分析为核心的系统。