如何将具有特定分数的排序集相交?

时间:2014-11-01 19:30:04

标签: redis

TL:博士; 我可以在两个有序集合之间进行交集,但仅适用于具有指定分数的字段吗? 例如:

ZADD zset1 1 "first"
ZADD zset1 2 "second"
ZADD zset2 1 "first"
ZADD zset2 2 "second"

<command_that_I_need> <score> 2 zset1 zset2

得分为1,将返回:

1 "first"

为什么我要这样做?

为什么呢?我需要先解释一些事情。

在我的模型中,有users,可以创建articles 每个article都与article_id相关联。

我想让任何人都可以搜索文章titles,并可选择指定user。 我通过在单词中分割查询并找出哪个articles包含这些单词来想到这一点。

我能够做到这一点,因为我以这种方式存储这些信息:

zadd search_words:<word> <user_id> <article_id>

每次创建文章时,其标题都会在words中拆分。对于word中的每个words,我创建了该有序集。

这样,我会用单词分割每个查询,并与search_words:<word>有序集相交。 我确实希望按分数进行过滤,因为可以让我按user_id进行过滤。

注意:由于文章也有内容,我知道用户希望搜索查看内容,但这超出了我的项目范围,因此我暂时忽略了这一点。登记/> 注2:有更好的解决方案吗?

1 个答案:

答案 0 :(得分:1)

在这种情况下,没有一个命令可以进行出价。一种方法是首先对所有集合执行ZINTERSTORE,然后对结果执行ZRANGEBYSCORE以按user_id进行过滤。

注意2:您使用排序集的分数是可以接受的,因为显然user_id是数字。但是,更简单的方法是使用常规集。您可以继续对单词和文章使用相同的机制,但不是在分数中存储article_id&lt; - &gt; user_id关系,而是为每个用户使用专用集,例如:

SADD articles:<user_id> <article_id>

然后,要对特定字词和用户的文章进行查询,只需按SINTER[STORE]执行:

SINTER articles:<user_id> search_words:<word1> search_words:<word2>...