如何在Elasticsearch中过滤用户已观看的剧集?
可行!用用户-已看剧集关联条目实现排除逻辑
直接说结论:完全可以通过存储用户ID与已观看剧集ID的关联条目来实现需求,这是Elasticsearch场景下处理这类排除逻辑的更优方案,既避开了数组扩容的隐患,也不会造成大量数据冗余。
具体怎么实现?
1. 新建关联索引
创建一个专门存储观看记录的索引(比如叫user_watched_episodes),每条文档只存核心关联数据就行,结构示例:
{ "user_id": "u_1001", "episode_id": "ep_2005", "watched_at": "2024-05-20T14:30:00Z" // 可选字段,用来记录观看时间 }
2. 查询时的排除逻辑
要获取某节目(比如program_id=pg_3002)的未看剧集,分两步走:
- 先从
user_watched_episodes索引里查出当前用户的所有已看剧集ID,得到一个数组,比如["ep_2001", "ep_2003"] - 再去剧集索引里查询属于该节目,且
episode_id不在上述数组中的内容,用ES的bool+must_not就能实现:
{ "query": { "bool": { "must": [ {"term": {"program_id": "pg_3002"}} ], "must_not": [ {"terms": {"episode_id": ["ep_2001", "ep_2003"]}} ] } } }
3. 性能优化小技巧
- 给
user_id和episode_id设为keyword类型并建立索引,确保查询速度 - 如果用户已看剧集特别多,用ES的
scroll或者point-in-time批量拉取已看ID,别一次性返回太多数据 - 根据用户规模给关联索引设置合适的分片数,避免查询瓶颈
为啥这个方案比你之前考虑的好?
- 对比「存储已看剧集数组」:没有数组扩容风险,每个观看行为都是独立文档,不会因为用户看的剧太多导致单文档过大,影响查询性能
- 对比「为每个用户创建剧集列表」:不用冗余存整个剧集的所有信息,只存关联关系,存储空间占用极小,维护成本也低
附上你提供的现有数据结构截图:
内容的提问来源于stack exchange,提问作者Luis Rodolfo Molina Molina
相关产品推荐
相关产品推荐

