多标签搜索想法
传统:找到每个标签对应的所有行,将所有行进行交集,输出结果。
问题:当行数非常多的时候,内存开销极大。
希望:维持低内存占用,可以加长访客查询等待时间,如此做法是否可行?
想法:
1. 假设用户查询 A B C 三个标签,每个标签各有 200W 100W 50W 行结果。
2. 从结果最少的 C 标签取 1W 行。
3. 将1万行的ID分别带入AB对应索引进行查询,若行中ABC标签均存在则保留。
4. 计算是否满足分页所需数量(如100条),若不满足则输出当前已有结果,继续查找。
5. 可在查询到部分行数后实时输出,此处过程用前端AJAX交互并计入URL参数效果最佳。
土鳖老旧写法,不适用于AI、大数据等牛逼的现代化数据计算方式。
建议:为了访客体验和最佳性能,最好还是不用多标签交集查询。
wxjv99引用要注意下分页的问题,对于你的取 标签过滤后最少的结果集 作为初始过滤数据集 而言,要想办法记录每页 起始/结尾 在初始过滤数据集(C表结果)中是第多少条,这样用户按顺序翻页会快一些 这样查...
wxjv99 要注意下分页的问题,对于你的取 标签过滤后最少的结果集 作为初始过滤数据集 而言,要想办法记录每页 起始/结尾 在初始过滤数据集(C表结果)中是第多少条,这样用 ...
没那么复杂,我是直接把最后处理的ID返回给用户,下次查询时直接从这个ID开始找就可以了。我的翻页逻辑和常见的页数不一样,我是按时间戳来分页的,下一页=上次时间戳后的结果集,所以这个问题比较好解决。
给你推荐个算法外的解决方案 sonic 他将 搜索条件-ID 缓存起来,可以看作轻量化的 elasticsearch ,应该能满足你的需求,功能更全面
C引用冰雪殇璃陌梦懂了,确实这样内存占用会稳定一些 这是在拉屎的时候想到的,因为多标签交集这个问题一直很困扰,如果每个标签对应的有100万数据,即便只把ID查出来取交集也会内存爆炸。于是我就想,能不能...
C 这是在拉屎的时候想到的,因为多标签交集这个问题一直很困扰,如果每个标签对应的有100万数据,即便只把ID查出来取交集也会内存爆炸。于是我就想,能不能像拉屎一样,一截截地把数据挤出来,返回给用户?于是就 ...
100万个int32类型的ID,也就3.8M,加上 占大头的搜索条件 应该不超过百M,主要还是数据库在查找和处理数据时内部算法占用了大量内存,可以看看上面的方案,sonic比elasticsearch占用少的多