Elasticsearch需创建单个还是多个索引?按实体建索引时如何合并返回结果
Elasticsearch 索引拆分与多索引合并查询解决方案
索引创建策略选择
两种方案没有绝对优劣,可根据你的实际业务场景判断:
- 如果不同实体的字段重合度极低、数据量级差异大、读写QPS差距明显,优先按实体拆分独立索引
拆分后各索引可以独立配置分片数、生命周期规则,调整Mapping或者扩容都不会影响其他实体的数据,查询时也不需要额外过滤实体类型,性能更高。比如商品、用户、订单三类完全独立的实体,就适合拆分创建索引。 - 如果不同实体的字段重合度超过70%、整体数据量不大(单索引文档数低于1亿、存储低于50GB)、查询经常需要跨实体拉取数据,可以选择存在同一个索引,额外加一个
entity_type字段区分不同实体即可,能降低集群元数据的管理压力。
多索引合并查询实现
Elasticsearch 原生支持多索引查询,不需要自己写代码合并响应结果,常用两种实现方式:
1. 直接指定多索引查询
查询时在请求路径中用逗号分隔多个索引名即可,ES会自动聚合所有索引的符合条件的结果,返回格式和单索引查询完全一致,示例:
# 同时查询user、order、product三个索引 GET /user,order,product/_search { "query": { "match": { "title": "关键词" } } }
如果索引有统一的命名前缀,还可以用通配符匹配:
# 查询所有以entity_开头的索引 GET /entity_*/_search
2. 用索引别名统一管理
如果后续会频繁新增、下线实体索引,不想每次修改查询语句的索引列表,可以给所有实体索引绑定同一个别名:
POST _aliases { "actions": [ {"add": {"index": "user", "alias": "all_entity"}}, {"add": {"index": "order", "alias": "all_entity"}}, {"add": {"index": "product", "alias": "all_entity"}} ] }
后续查询直接调用别名即可,和单索引查询用法完全一致:GET /all_entity/_search
后续新增实体索引只要绑定同一个别名,查询侧不需要做任何修改就能自动包含新索引的数据。
- 注意:多索引查询要求不同索引中参与查询、排序、聚合的同名字段类型保持一致,否则会触发类型匹配错误,提前规划Mapping时需要注意对齐同名字段的定义。
内容的提问来源于stack exchange,提问作者payal chauhan
相关产品推荐
相关产品推荐

