使用Elastic查询同时在9月和10月有购买记录的用户数量
统计同时在9月和10月有购买行为的用户数量解决方案
核心思路
要找出同时在两个月份有购买记录的用户,需先筛选出所有9月或10月的购买文档,按用户分组后统计每个用户在两个月份的购买次数,最后筛选出两个月份都有购买的用户并统计总数。
可行的Elasticsearch查询示例
假设你的date_of_purchase字段是date类型(若为字符串类型,需确保格式符合日期解析要求,或优先将字段映射为date类型),查询如下:
{ "size": 0, // 不需要返回具体文档,只看聚合结果 "query": { "bool": { "should": [ { "range": { "date_of_purchase": { "gte": "2022-09-01", "lte": "2022-09-30" } } }, { "range": { "date_of_purchase": { "gte": "2022-10-01", "lte": "2022-10-31" } } } ], "minimum_should_match": 1 // 只要满足其中一个月份的购买即可进入聚合 } }, "aggs": { "group_by_customer": { "terms": { "field": "customer_id", "size": 10000 // 若用户数量超过1万,需调整此值或改用composite聚合分页 }, "aggs": { "check_purchase_months": { "filters": { "filters": { "september_purchase": { "range": { "date_of_purchase": { "gte": "2022-09-01", "lte": "2022-09-30" } } }, "october_purchase": { "range": { "date_of_purchase": { "gte": "2022-10-01", "lte": "2022-10-31" } } } } } }, "filter_both_months": { "bucket_selector": { "buckets_path": { "sept_count": "check_purchase_months.september_purchase._count", "oct_count": "check_purchase_months.october_purchase._count" }, "script": "params.sept_count > 0 && params.oct_count > 0" } } } }, "total_qualified_users": { "bucket_count": { "buckets_path": "group_by_customer" } } } }
结果说明
执行查询后,total_qualified_users字段的数值即为同时在9月和10月产生购买行为的用户总数。
注意事项
- 如果用户量级极大,
terms聚合的size参数无法覆盖所有用户时,建议使用composite聚合进行分页统计,避免内存溢出。 - 若
date_of_purchase是字符串类型,需确保其格式(如yyyy-MM-dd)能被Elasticsearch正确识别为日期,否则需调整range查询的参数格式,或提前修改字段映射为date类型。
内容的提问来源于stack exchange,提问作者Noah Sealy
相关产品推荐
相关产品推荐

