最好的解决方案,根据他们在Redis上的分数对2(或N)个有序集进行远程搜索

时间:2017-11-16 16:06:58

标签: sorting optimization redis

我有一些索引(有序集)包含按时间戳排序的键名称,这些索引用于搜索目的,例如一个索引apple和一个索引red,apple包含所有引用apple的键名和red所有键引用一件红色的事。

所有这些都按照主键创建的时间戳排序,所以我想用它进行搜索。

对于一个游戏来说,这不是一个问题,我会对苹果进行分页,例如将所有苹果分类到按日期排序的分页范围内,但我的问题是当我想要合并2个字段时。

例如,如果想要所有红苹果,我可以肯定,但我必须使用zunionstore和zrange(太长)或获得所有的2索引来执行基于日期的过滤器,我搜索最快的解决方案这样做。

感谢您阅读:)

1 个答案:

答案 0 :(得分:0)

您描述的方法 - let sourceData = [ { "metric": "Approved", "rounded_counts": [ { "2017-11-16 15:10:00": 3 }, { "2017-11-16 15:11:00": 5 } ] }, { "metric": "Approved", "rounded_counts": [ { "2017-11-16 15:10:00": 28 }, { "2017-11-16 15:11:00": 28 } ] }, { "metric": "Quarantine", "rounded_counts": [ { "2017-11-16 15:10:00": 1 }, { "2017-11-16 15:11:00": 2 } ] } ]; let charDataTmp = {} let chartData = [] //uniqueify sourceData.forEach(block => { if (!charDataTmp[block.metric]) { charDataTmp[block.metric]={rounded_counts:{}} } block.rounded_counts.forEach(roundedCount => { let key = Object.keys(roundedCount)[0] if (!charDataTmp[block.metric].rounded_counts[key]) { charDataTmp[block.metric].rounded_counts[key] = 0 } charDataTmp[block.metric].rounded_counts[key] += roundedCount[key] }) }) //unfold Object.keys(charDataTmp).forEach(nameGroup => { chartData.push({ name: nameGroup, data: Object.keys(charDataTmp[nameGroup].rounded_counts).map(counts => { return [ counts, charDataTmp[nameGroup].rounded_counts[counts] ] }) }) }) console.log(JSON.stringify(chartData, null, 4)) 后跟ZUNIONSTORE是Redis核心中最有效的方法。或者,您可以使用RediSearch进行robuster索引和搜索功能。