文章目录
- 目录
-
- [一、ES 核心定位与核心特性](#一、ES 核心定位与核心特性)
-
- [1. 核心定位](#1. 核心定位)
- [2. 核心特性](#2. 核心特性)
- [二、ES 核心概念(对比数据库,快速理解)](#二、ES 核心概念(对比数据库,快速理解))
- [三、ES 核心原理:倒排索引](#三、ES 核心原理:倒排索引)
-
- [1. 正排索引 vs 倒排索引](#1. 正排索引 vs 倒排索引)
- [2. 倒排索引结构(核心两部分)](#2. 倒排索引结构(核心两部分))
-
- (1)词典(Dictionary)
- [(2)倒排表(Posting List)](#(2)倒排表(Posting List))
- [3. 分词器(Analyzer)的作用](#3. 分词器(Analyzer)的作用)
- [四、ES 数据操作(REST API 示例)](#四、ES 数据操作(REST API 示例))
-
- [1. 索引管理(创建/删除索引、设置映射)](#1. 索引管理(创建/删除索引、设置映射))
- [2. 文档 CRUD(增删改查)](#2. 文档 CRUD(增删改查))
-
- [(1)新增文档(指定 ID 或自动生成 ID)](#(1)新增文档(指定 ID 或自动生成 ID))
- [(2)查询文档(按 ID 查询、条件查询)](#(2)查询文档(按 ID 查询、条件查询))
- (3)更新文档(全量更新/部分更新)
- (4)删除文档
- [3. 聚合查询(数据分析核心)](#3. 聚合查询(数据分析核心))
- [五、ES 集群架构(高可用与扩展性核心)](#五、ES 集群架构(高可用与扩展性核心))
-
- [1. 节点类型(Node Types)](#1. 节点类型(Node Types))
- [2. 分片机制(Sharding)](#2. 分片机制(Sharding))
- [3. 集群发现与选举](#3. 集群发现与选举)
- [六、ES 性能优化(生产环境核心)](#六、ES 性能优化(生产环境核心))
-
- [1. 索引设计优化](#1. 索引设计优化)
- [2. 写入性能优化](#2. 写入性能优化)
- [3. 查询性能优化](#3. 查询性能优化)
- [4. 集群优化](#4. 集群优化)
- [七、ES 典型应用场景](#七、ES 典型应用场景)
-
- [1. 全文检索场景](#1. 全文检索场景)
- [2. 日志/监控分析(ELK 栈)](#2. 日志/监控分析(ELK 栈))
- [3. 数据分析场景](#3. 数据分析场景)
- [4. 地理信息检索(GIS)](#4. 地理信息检索(GIS))
- [八、ES 与数据库的区别(技术选型参考)](#八、ES 与数据库的区别(技术选型参考))
- 九、总结
目录
若对您有帮助的话,请点赞收藏加关注哦,您的关注是我持续创作的动力!有问题请私信或联系邮箱:funian.gm@gmail.com
Elasticsearch(简称ES)是一款基于 Lucene 构建的分布式、高扩展、高实时的全文搜索引擎与数据分析引擎。它不仅能高效处理全文检索,还支持结构化数据查询、聚合分析、日志存储与分析等场景,广泛应用于电商搜索、日志监控、数据分析等领域。

一、ES 核心定位与核心特性
1. 核心定位
- 全文搜索引擎:快速检索海量文本数据(如商品标题、文章内容),支持模糊匹配、关键词高亮、分词检索等。
- 分布式数据分析引擎:支持对结构化/非结构化数据进行聚合统计(如按分类统计销量、按时间区间统计日志量)。
- 存储引擎:支持海量数据的分布式存储,提供高可用、高扩展的存储方案(兼容 JSON 文档格式)。
2. 核心特性
| 特性 | 说明 |
|---|---|
| 分布式架构 | 数据自动分片存储,支持水平扩展(增加节点即可提升容量和性能)。 |
| 实时性 | 写入数据后秒级可查询(近实时 NRT,Near Real-Time)。 |
| 多类型查询 | 支持全文检索、精确查询、范围查询、地理查询、聚合查询等多种查询方式。 |
| 高可用 | 支持副本分片(Replica),节点故障时自动切换,数据不丢失。 |
| 易集成 | 提供 RESTful API、Java/Python/Go 等多语言客户端,支持与 Kibana、Logstash 等工具联动(ELK/ELFK 栈)。 |
| 分词支持 | 内置多种分词器(英文、中文等),支持自定义分词(如 IK 分词器适配中文)。 |
二、ES 核心概念(对比数据库,快速理解)
ES 的术语与传统数据库有对应关系,通过对比可快速掌握:
| ES 概念 | 传统数据库概念 | 说明 |
|---|---|---|
| 索引(Index) | 数据库(Database) | 存储同类文档的集合(如"商品索引""日志索引"),索引名小写,不可包含特殊字符。 |
| 文档(Document) | 行(Row) | 索引中的最小数据单元,以 JSON 格式存储(如一条商品数据、一条日志)。 |
| 类型(Type) | 表(Table) | 索引内的文档分类(ES 7.x 后已废弃,一个索引仅支持一种文档结构)。 |
| 字段(Field) | 列(Column) | 文档中的属性(如商品的"名称""价格""分类")。 |
| 映射(Mapping) | 表结构(Schema) | 定义文档中字段的类型(如文本、数值、日期)、分词器、是否索引等规则。 |
| 分片(Shard) | 分表 | 索引的物理分片(默认 5 个主分片),分布式存储的核心,支持水平扩展。 |
| 副本(Replica) | 备份 | 主分片的副本(默认 1 个副本),用于故障恢复和负载均衡(查询请求可路由到副本)。 |
关键补充:
- 分片(Shard):分为主分片(Primary Shard)和副本分片(Replica Shard)。主分片负责数据写入,副本分片是主分片的备份,仅负责查询。主分片数量在索引创建时指定,后续不可修改(需通过重建索引调整)。
- 映射(Mapping) :支持动态映射(Dynamic Mapping)和静态映射(Explicit Mapping)。动态映射会自动根据文档字段类型推断映射规则(如 JSON 字符串默认映射为
text类型),静态映射需手动定义字段类型(推荐生产环境使用,避免自动推断错误)。
三、ES 核心原理:倒排索引
ES 之所以能实现高效全文检索,核心是基于 倒排索引(Inverted Index) 数据结构,而非传统数据库的"正排索引"。
1. 正排索引 vs 倒排索引
- 正排索引:按"文档 ID → 文档内容"存储(如数据库按主键查询),适合精确匹配,但全文检索时需遍历所有文档,效率极低。
- 倒排索引:按"关键词 → 文档 ID 列表"存储,先对文档内容分词,再建立关键词到文档的映射,查询时直接通过关键词定位文档,效率极高。
2. 倒排索引结构(核心两部分)
(1)词典(Dictionary)
存储所有去重后的关键词(如"手机""华为""5G"),并指向对应的倒排表。为了加速关键词查找,词典会采用跳表、哈希表或 B+ 树等结构优化。
(2)倒排表(Posting List)
存储包含该关键词的文档 ID 列表,以及关键词在文档中的位置、频率等信息(用于相关性排序)。示例如下:
| 关键词 | 倒排表(文档 ID + 位置/频率) |
|---|---|
| 华为 | (doc1, 位置1)、(doc3, 位置5)、(doc7, 位置3) |
| 5G | (doc1, 位置3)、(doc2, 位置2)、(doc7, 位置6) |
3. 分词器(Analyzer)的作用
倒排索引的构建依赖分词器,分词器的核心作用是将文档的文本字段拆分为关键词(Term)。例如:
- 中文文本:"华为 5G 手机" → 分词后为 ["华为", "5G", "手机"](需使用 IK 分词器,ES 内置中文分词效果差)。
- 英文文本:"Huawei 5G Phone" → 分词后为 ["huawei", "5g", "phone"](内置 Standard 分词器即可)。
常用分词器:
- Standard Analyzer:默认分词器,适用于英文(按空格、标点分词,小写化)。
- IK Analyzer:中文专用分词器,支持细粒度(如"北京大学"→"北京""大学")和粗粒度(如"北京大学"→"北京大学")分词。
- Keyword Analyzer:不分词,将整个字段作为一个关键词(适用于精确匹配场景,如"订单号")。
四、ES 数据操作(REST API 示例)
ES 提供 RESTful API 用于数据交互,核心操作包括"索引管理、文档 CRUD、查询与聚合",以下是高频操作示例(基于 ES 7.x)。
1. 索引管理(创建/删除索引、设置映射)
(1)创建索引(指定映射规则)
http
PUT /product # 索引名:product(商品索引)
{
"settings": {
"number_of_shards": 3, # 主分片数量(创建后不可修改)
"number_of_replicas": 1 # 副本分片数量(可动态修改)
},
"mappings": {
"properties": {
"id": { "type": "long", "index": true }, # 数值类型,支持索引
"name": { "type": "text", "analyzer": "ik_max_word" }, # 文本类型,IK细粒度分词
"price": { "type": "double" }, # 浮点类型
"category": { "type": "keyword" }, # 关键词类型(不分词,精确匹配)
"create_time": { "type": "date", "format": "yyyy-MM-dd HH:mm:ss" } # 日期类型
}
}
}
(2)删除索引
http
DELETE /product # 删除整个商品索引(谨慎操作!)
2. 文档 CRUD(增删改查)
(1)新增文档(指定 ID 或自动生成 ID)
http
# 指定 ID:PUT /索引名/_doc/文档ID
PUT /product/_doc/1
{
"id": 1,
"name": "华为 Mate 60 Pro 5G 手机",
"price": 6999.0,
"category": "手机",
"create_time": "2025-01-01 10:00:00"
}
# 自动生成 ID:POST /索引名/_doc
POST /product/_doc
{
"id": 2,
"name": "苹果 iPhone 15 Pro",
"price": 7999.0,
"category": "手机",
"create_time": "2025-01-02 14:30:00"
}
(2)查询文档(按 ID 查询、条件查询)
http
# 按 ID 查询
GET /product/_doc/1
# 条件查询(查询分类为"手机"、价格 < 7500 的商品)
GET /product/_search
{
"query": {
"bool": {
"must": [
{ "term": { "category": "手机" } }, # keyword 类型精确匹配
{ "range": { "price": { "lt": 7500 } } } # 范围查询(lt=小于)
]
}
},
"sort": [{"price": "desc"}], # 按价格降序排序
"from": 0, "size": 10, # 分页(从第0条开始,取10条)
"highlight": { # 关键词高亮(若查询包含文本检索,匹配词标黄)
"fields": { "name": {} }
}
}
(3)更新文档(全量更新/部分更新)
http
# 全量更新(覆盖整个文档)
PUT /product/_doc/1
{
"id": 1,
"name": "华为 Mate 60 Pro 5G 手机(12GB+512GB)",
"price": 7299.0,
"category": "手机",
"create_time": "2025-01-01 10:00:00"
}
# 部分更新(仅修改价格字段)
POST /product/_update/1
{
"doc": { "price": 7199.0 }
}
(4)删除文档
http
DELETE /product/_doc/1 # 按 ID 删除文档
3. 聚合查询(数据分析核心)
聚合查询用于对数据进行统计分析(如求和、分组、排序),类似 SQL 的 GROUP BY+SUM/COUNT。
示例:统计各分类商品的数量和平均价格
http
GET /product/_search
{
"size": 0, # 不返回文档详情,仅返回聚合结果
"aggs": {
"category_group": { # 聚合名称(自定义)
"terms": { "field": "category", "size": 10 }, # 按 category 分组(取前10个分类)
"aggs": {
"avg_price": { "avg": { "field": "price" } }, # 计算每组平均价格
"product_count": { "value_count": { "field": "id" } } # 计算每组商品数量
}
}
}
}
返回结果核心部分:
json
"aggregations": {
"category_group": {
"buckets": [
{ "key": "手机", "doc_count": 2, "avg_price": { "value": 7599.0 }, "product_count": { "value": 2 } },
{ "key": "电脑", "doc_count": 3, "avg_price": { "value": 8999.0 }, "product_count": { "value": 3 } }
]
}
}
五、ES 集群架构(高可用与扩展性核心)
ES 集群由多个节点(Node)组成,通过分布式架构实现数据分片存储和负载均衡,核心架构如下:
1. 节点类型(Node Types)
| 节点类型 | 作用 |
|---|---|
| 主节点(Master Node) | 管理集群元数据(如索引创建/删除、分片分配),不参与数据读写(默认所有节点可竞选主节点)。 |
| 数据节点(Data Node) | 存储数据(主分片+副本分片),处理数据读写和聚合查询(性能消耗大,需配置高 CPU/内存/磁盘)。 |
| 协调节点(Coordinating Node) | 接收客户端请求,分发请求到数据节点,聚合结果后返回(默认所有节点都是协调节点)。 |
| ingest 节点 | 数据写入前的预处理(如数据转换、过滤),不存储数据(适用于日志清洗场景)。 |
2. 分片机制(Sharding)
- 主分片(Primary Shard):数据写入的核心分片,每个索引的主分片数量固定(创建时指定),数据均匀分布在不同主分片上。
- 副本分片(Replica Shard):主分片的备份,仅负责查询,不参与写入。当主分片故障时,ES 会自动将副本分片升级为主分片,保证高可用。
示例:索引 product 配置 3 个主分片(P0、P1、P2)和 1 个副本,集群有 2 个数据节点:
- 节点 1:存储 P0、P1(主分片)+ P2 的副本(R2)。
- 节点 2:存储 P2(主分片)+ P0、P1 的副本(R0、R1)。
3. 集群发现与选举
- 集群通过
cluster.name标识,节点启动后自动加入同名集群。 - 主节点选举:当原主节点故障时,候选节点(
node.master: true)通过投票机制选举新主节点(需超过半数节点同意,避免脑裂)。
六、ES 性能优化(生产环境核心)
1. 索引设计优化
- 合理设置分片数量:主分片数量 = 数据节点数 × 1~2(如 3 个数据节点 → 3~6 个主分片),避免分片过多(浪费资源)或过少(无法扩展)。
- 字段类型优化 :
- 无需检索的字段设置
index: false(如"商品详情"大文本,仅存储不检索)。 - 精确匹配字段用
keyword类型(如订单号、分类),避免用text类型(分词会导致匹配错误)。
- 无需检索的字段设置
- 关闭动态映射 :生产环境禁用
dynamic: true,避免非法字段自动映射导致索引膨胀。
2. 写入性能优化
- 批量写入 :使用
_bulkAPI 批量提交文档(每次 1000~5000 条,避免单次提交过多导致内存溢出)。 - 关闭副本写入(临时) :初始化海量数据时,先设置
number_of_replicas: 0,写入完成后恢复副本(减少副本同步开销)。 - 调整刷新间隔 :默认每 1 秒刷新一次(使数据可查询),写入密集场景可设置
index.refresh_interval: 30s(牺牲实时性换写入性能)。
3. 查询性能优化
- 避免全表扫描 :使用
term/range等精确查询,避免match_all(遍历所有文档)。 - 限制返回字段 :用
_source指定返回字段(如_source: ["name", "price"]),避免返回冗余字段。 - 使用过滤查询(filter) :
filter语句不计算相关性得分,且结果可缓存(如查询"分类=手机"的商品,用filter而非must)。 - 优化聚合查询 :避免对
text类型字段聚合,优先使用keyword类型;限制聚合结果数量(size参数)。
4. 集群优化
- 数据节点与主节点分离 :生产环境单独配置主节点(
node.data: false),避免数据节点负载过高影响集群稳定性。 - 磁盘选择:使用 SSD 磁盘(读写速度是机械硬盘的 10 倍以上),避免磁盘 IO 成为瓶颈。
- 索引生命周期管理(ILM):对日志等时序数据,设置索引过期策略(如 30 天前的日志自动删除),避免索引过大。
七、ES 典型应用场景
1. 全文检索场景
- 电商商品搜索:支持关键词检索、分类筛选、价格范围查询、高亮显示(如淘宝/京东的商品搜索)。
- 文档检索:企业知识库、文档管理系统(如 PDF/Word 文档的全文检索)。
2. 日志/监控分析(ELK 栈)
- 架构:Elasticsearch + Logstash(日志采集清洗) + Kibana(可视化)。
- 场景:收集服务器日志、应用日志、运维监控数据,支持按时间范围查询、异常告警、趋势分析(如排查线上故障时检索错误日志)。
3. 数据分析场景
- 用户行为分析:统计用户访问量、点击量、购买转化率,按地区/时间/设备分组分析。
- 业务指标监控:实时统计电商销量、订单量、库存变化,生成可视化报表。
4. 地理信息检索(GIS)
- 场景:外卖商家搜索、附近景点查询(支持按地理位置排序、范围筛选,如"查找 3 公里内的咖啡店")。
八、ES 与数据库的区别(技术选型参考)
| 对比维度 | Elasticsearch | 关系型数据库(MySQL) | NoSQL(MongoDB) |
|---|---|---|---|
| 核心用途 | 全文检索、数据分析、日志存储 | 事务性业务(订单、用户数据) | 文档存储、非事务性业务 |
| 数据模型 | JSON 文档(无固定 schema) | 表结构(固定 schema) | BSON 文档(灵活 schema) |
| 查询能力 | 全文检索、聚合查询强 | 事务、关联查询(JOIN)强 | 文档查询强,全文检索弱 |
| 事务支持 | 弱(仅支持单文档事务) | 强(ACID 特性) | 支持单文档事务,多文档弱 |
| 写入性能 | 高(批量写入+异步刷新) | 中(受事务和索引约束) | 高(文档存储,无复杂索引) |
| 适用场景 | 搜索、日志、数据分析 | 核心业务数据(订单、支付) | 内容管理、非结构化数据存储 |
九、总结
Elasticsearch 是一款功能强大的分布式搜索引擎与数据分析引擎,核心优势在于 全文检索速度快、分布式架构易扩展、支持复杂聚合分析。生产环境中需重点关注索引设计、分片配置、性能优化和集群稳定性,结合 Kibana、Logstash 等工具可构建完整的日志分析、搜索服务解决方案。