ES中分片的含义

ES(Elasticsearch)里的"分片(Shard)" ,本质上是把一个索引的数据拆成多份存储的单位

每个分片其实就是一个 独立的 Lucene 索引,可以被放到不同的节点上,从而实现:

  • 数据水平扩展(数据太大时拆开存)
  • 并行查询(多个分片一起查,速度更快)
  • 高可用(副本分片可以容灾)

简单理解:

  • Index(索引) :逻辑概念,比如 order_index
  • Shard(分片):物理存储单元
  • Document(文档):具体数据

关系大概是:

Index → 被拆成多个 Shard → 每个 Shard 存一部分 Document


一、写入数据时 ES 怎么决定放哪个分片

ES 默认用一个 hash 路由算法

复制代码
shard = hash(_id) % number_of_primary_shards

如果有 3 个主分片

复制代码
hash(id) % 3

结果可能是:

  • 0 → shard0
  • 1 → shard1
  • 2 → shard2

二、一个真实的 3 分片案例

假设我们有一个电商订单索引:

复制代码
index: order_index
primary_shards: 3
replicas: 1

订单数据:

复制代码
{ "order_id": "1001", "user": "Tom",   "amount": 120 }
{ "order_id": "1002", "user": "Lucy",  "amount": 80 }
{ "order_id": "1003", "user": "Jack",  "amount": 200 }
{ "order_id": "1004", "user": "Amy",   "amount": 50 }
{ "order_id": "1005", "user": "David", "amount": 300 }
{ "order_id": "1006", "user": "Bob",   "amount": 90 }

经过 hash 路由后,可能分布如下:

shard 数据
shard0 1001, 1004
shard1 1002, 1005
shard2 1003, 1006

每个 shard 实际上是一个独立索引。

例如:

Shard0

复制代码
doc1: { "order_id": "1001", "user": "Tom", "amount": 120 }
doc2: { "order_id": "1004", "user": "Amy", "amount": 50 }

Shard1

复制代码
doc1: { "order_id": "1002", "user": "Lucy", "amount": 80 }
doc2: { "order_id": "1005", "user": "David", "amount": 300 }

Shard2

复制代码
doc1: { "order_id": "1003", "user": "Jack", "amount": 200 }
doc2: { "order_id": "1006", "user": "Bob", "amount": 90 }

三、查询时发生什么

当你执行:

复制代码
GET order_index/_search

ES 会做三步:

  1. 把查询广播给所有分片
  2. 每个 shard 独立查询
  3. 汇总结果返回

流程:

复制代码
client
   ↓
coordinator node
   ↓
shard0  shard1  shard2
   ↓       ↓       ↓
结果1   结果2   结果3
   ↓
merge + sort
   ↓
返回最终结果

四、再看一个真实集群结构例子

假设有 3 台机器

复制代码
node1
node2
node3

索引:

复制代码
order_index
primary_shards: 3
replicas: 1

分布可能是:

复制代码
node1
  shard0 (primary)
  shard1 (replica)

node2
  shard1 (primary)
  shard2 (replica)

node3
  shard2 (primary)
  shard0 (replica)

特点:

  • 每个 primary 都有 replica
  • primary 和 replica 不会在同一节点

这样即使一台机器挂了,数据也不会丢。


五、一句话理解

可以把 ES 想象成:

一个大表 → 自动拆成多个小表 → 分布到不同机器 → 查询时一起查再合并。

===================================================================

假设我们要建一个 订单索引 order_index

一、创建索引请求

复制代码
PUT /order_index
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 1
  },
  "mappings": {
    "properties": {
      "order_id": {
        "type": "keyword"
      },
      "user_id": {
        "type": "keyword"
      },
      "user_name": {
        "type": "text",
        "analyzer": "ik_max_word"
      },
      "amount": {
        "type": "double"
      },
      "status": {
        "type": "keyword"
      },
      "product_name": {
        "type": "text",
        "analyzer": "ik_smart"
      },
      "create_time": {
        "type": "date",
        "format": "yyyy-MM-dd HH:mm:ss"
      }
    }
  }
}

二、结构解释

1 settings(索引配置)

复制代码
"settings": {
  "number_of_shards": 3,
  "number_of_replicas": 1
}

含义:

  • number_of_shards:3
    • 主分片数量
  • number_of_replicas:1
    • 每个主分片有一个副本

所以最终会有:

复制代码
3 primary shard
3 replica shard
共 6 个 shard

2 mappings(字段结构)

这里类似 数据库表结构

例如:

复制代码
order_id   -> keyword
user_id    -> keyword
user_name  -> text
amount     -> double
status     -> keyword
create_time-> date

字段类型说明:

  • keyword

    • 不分词
    • 适合:ID、状态、标签
  • text

    • 会分词
    • 适合:搜索字段
  • double

    • 数值
  • date

    • 时间

三、插入一条真实数据

复制代码
POST /order_index/_doc
{
  "order_id": "10001",
  "user_id": "u1001",
  "user_name": "张三",
  "amount": 299.5,
  "status": "paid",
  "product_name": "荣耀手机",
  "create_time": "2026-05-11 10:23:00"
}

ES 实际存储时会变成类似:

复制代码
_index: order_index
_id: 自动生成或指定
_source: {
  order_id: "10001",
  user_id: "u1001",
  user_name: "张三",
  amount: 299.5,
  status: "paid",
  product_name: "荣耀手机",
  create_time: "2026-05-11 10:23:00"
}

四、真实公司常见的索引结构

很多业务索引会长这样:

复制代码
user_index
order_index
product_index
log_index

例如日志索引通常:

复制代码
log-2026.05.11
log-2026.05.12
log-2026.05.13

每天一个索引,方便管理和删除。

相关推荐
jkyy20145 小时前
深耕AI健康医疗数据智库,赋能企业构建主动健康管理新生态
大数据·人工智能·健康医疗
2601_961946087 小时前
AI API 网关实战:从单 Key 管理到企业级多租户架构
大数据·人工智能·金融·架构·api·个人开发
大大大大晴天9 小时前
Flink CDC 深度解析:从原理到实践的全链路指南
大数据·flink
IT新视界10 小时前
Elasticsearch信创国产化替代
大数据·elasticsearch·搜索引擎
汇策研习社10 小时前
改良版ADX指标实战指南:告别传统ADX滞后、震荡误判难题
大数据·经验分享·金融·区块链·fastbull
SelectDB10 小时前
宽表元数据膨胀怎么解?Doris Segment V3 对比 Parquet、Lance
大数据·数据库·数据分析
隔窗听雨眠11 小时前
从追赶者到定义者:中国BI如何借助AI实现弯道超车
大数据·人工智能
cspttty11 小时前
二本软件工程专业好就业吗?毕业后能做哪些岗位
大数据·软件工程
智圣新创0111 小时前
高校全域治理决策效能升级 智圣新创决策中台落地实操与行业趋势研判
大数据·人工智能·物联网
Elasticsearch12 小时前
用 Elasticsearch 的 RRF 融合检索,把矿物鉴定准确率从 36% 拉到 92%
elasticsearch