You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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,别一次性返回太多数据
  • 根据用户规模给关联索引设置合适的分片数,避免查询瓶颈

为啥这个方案比你之前考虑的好?

  • 对比「存储已看剧集数组」:没有数组扩容风险,每个观看行为都是独立文档,不会因为用户看的剧太多导致单文档过大,影响查询性能
  • 对比「为每个用户创建剧集列表」:不用冗余存整个剧集的所有信息,只存关联关系,存储空间占用极小,维护成本也低

附上你提供的现有数据结构截图:
ES现有数据结构截图

内容的提问来源于stack exchange,提问作者Luis Rodolfo Molina Molina

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 20:45:39