功能简述:我们有一批数据存在 ES 上(每个数据有一个唯一 ID ),然后每个用户可以对这个数据进行转存(转存后会在 mysql 记录一条 userId 与数据 ID 的关系)。 用户 ID 长度为 14 字符长度。
对客提供搜索功能,其中有一个过滤条件是过滤用户已转存数据。 现在问题是如果有 2000 个用户都对同一个数据进行了转存 那该怎么实现这个方案呢? 最开始我想的是在 ES 上加一个转存用户 ID 列表 但是如果 2000 个用户都正好在一个热点数据上 岂不是这个字段需要挂一个 2000 个元素的列表,好像不太好?
所以请教各位大佬 行业有什么标准方案吗 或者有推荐的思路
1
N9f8Pmek6m8iRWYe 292 天前
es 不适合用在这个场景
|
2
luckyxl 292 天前
先通过 mysql 查出和用户相关的数据 id,再通过这些 id 去查 ES
|
4
sbhhhhhh OP @stevenchengmask 大佬有什么通用方案吗 主要是目前数据选型已经是 es 了 看看有没有什么可用的方案
|
5
gadfly3173 292 天前 via Android 2
听起来是类似于找出我没有关注的 up 主一类的需求,你可以参考一下 b 站的这个 https://www.bilibili.com/read/cv24151036/
或者如果是可以不用严格分页/显示页码的情况的话,可以考虑每次按照特定排序拉 1.5 倍需要的数据,从拿出来的数据里在过滤掉已经转存过的,数据量不够的话再查一次,分页就根据 id 而不是页码来 |
6
Exception615 292 天前
在进行 [转存] 前可以把 [数据 ID+用户 ID 这条转存记录] 记到布隆过滤器里
|
7
Jinnrry 292 天前 via Android
数据量多少?用户量多少?查询 QPS 多少?仅仅是 2000 个用户的话,数据上面加个字段存用户 id 没有任何问题,用户 id 用逗号或者空格分词
|
8
sbhhhhhh OP @gadfly3173 好的非常感谢~
|
9
sbhhhhhh OP @Jinnrry ES 上的数据差不多 2000 万,用户量在 1w 以内 查询 qps 可以做限制 比如 200 内 100 内。主要是考虑一个用户 ID 的长度为 14 字符 如果有 2000 个 那么长度是不是太长了导致 ES 的文档占用太多空间?
|
10
sbhhhhhh OP @Exception615 那查询时怎么做 [未转存过]的过滤呢 内存做过滤吗
|
11
Jinnrry 292 天前 via Android 1
@sbhhhhhh 完全不会,你太小看 es 了。用户 id 字段分词后会变成倒排索引,不会有重复的存储消耗。1 万个 id 的空间消耗远低于 2000 万篇 1 万字的文章索引。
这点数据量对 es 来说完全就是毛毛雨 |
12
sbhhhhhh OP @Jinnrry 那么也就是说,现有 2000 万数据的一个索引上,我增加一个[已转存用户列表]字段,用户 ID 长度 14 字符,通过空格或者逗号拼接做成倒排索引,完全可以支持 1 万个 ID 挂上去。 听大佬这么说,貌似是的,对 ES 不是很了解 这个我再去瞅瞅,感谢大佬。
|
15
1018ji 291 天前
用户数组就是了,就 1w 用户感觉也就那样
实在不行就父子文档了 |
16
Exception615 291 天前
@sbhhhhhh #14 是的 楼上说的对~ 我昨天没说详细,布隆过滤器用 bitmap 实现的映射,空间消耗很少,适合做大数据量下的过滤判断哈
|