路由
本章定位:ES 如何决定一个文档存入哪个分片?搜索时如何找到正确的分片?——答案都在路由机制中。
定义与作用
**路由(Routing)**通过公式 hash(_routing) % num_primary_shards 计算出文档应存入的目标分片。默认使用 _id 作为路由值。
解决的痛点:没有路由,ES 不知道文档属于哪个分片;路由错误则无法读到已存文档。
完整示例:小崔的定制路由
# 默认路由(基于 _id)
PUT /orders/_doc/1001
{ "user_id": "user_123", "amount": 299.0 }
# → 分片 = hash("1001") % 5
# 自定义路由(按 user_id)
PUT /orders/_doc/1001?routing=user_123
{ "user_id": "user_123", "amount": 299.0 }
# → 同一用户的所有文档在同分片 → 单分片查询
路由搜索优化
GET /orders/_search?routing=user_123
{ "query": { "term": { "user_id": "user_123" } } }
# → 仅搜索 1 个分片(而非广播到 5 个)
小结
路由 = 文档→分片映射。自定义 routing 将关联数据导向同一分片,减少搜索分片数。代价:数据可能倾斜(热点用户问题)。