多Elasticsearch索引场景下Kibana查询客户注册移动应用数量咨询
你当前采用的是类关系型数据库的三表分拆索引设计,直接给三个结构完全不同的索引创建统一Kibana索引模式是不可行的——Kibana索引模式仅适用于结构一致、存储同类数据的多个索引做统一查询,不同结构索引混用得到的是所有索引字段的无序并集,查询时会同时扫三个索引,自然无法得到有效结果。
方案1:仅需统计指定客户的注册应用数量
无需关联另外两个索引,直接查询registered_mobile_applications索引即可:
你当前的registered_mobile_applications索引中,applicationId字段存储的是客户ID,mobileappIds数组存储该客户注册的所有应用ID,数组长度即为注册数量。
查询示例如下:
GET registered_mobile_applications/_search { "query": { "term": { "applicationId": "mobileuser_id1" // 替换为你要查询的目标客户ID } }, "script_fields": { "registered_app_count": { "script": { "source": "doc['mobileappIds.keyword'].length" } } }, "_source": false }
返回结果中的registered_app_count字段就是该客户的注册应用数量。如果需要同时返回客户基础信息,可以先根据客户ID查mobile_users索引,再拼接结果即可。
方案2:需要在Kibana中做批量统计/可视化
如果要实现类似「所有客户的注册应用数量排名」「按客户名称查询注册应用数」这类需要关联多个索引的查询,可以使用Elasticsearch的Transform功能生成关联后的宽表索引:
- 创建一个pivot transform,以
registered_mobile_applications的applicationId为聚合主键,关联mobile_users的用户属性、mobile_applications的应用属性 - Transform会定时生成新的汇总索引,基于这个汇总索引创建Kibana索引模式,就可以正常做查询、可视化操作了。
注意事项
你当前registered_mobile_applications索引中的applicationId字段命名存在歧义,实际存储的是客户ID,建议后续优化命名为user_id避免混淆。
内容的提问来源于stack exchange,提问作者jack
相关产品推荐
相关产品推荐

