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:有更好的解决方案吗?
答案 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>...