2017-09-12 15 views
3

効率的に交差させるために、赤いスペースに保存したいデータがあります。例のデータ:データセットが不完全な場合不完全な赤いセットの交差

key | members 
--------------------------------- 
101 | "a1", "a2", "a3" 
102 | "a2", "a3" 
103 | "a2", "a4" 

ので、これらのキーの交点は私に

SINTER 101 102 103 
1) "a2" 

を与えるだろうが、私はいくつかの問題があります。この場合、

key | members 
--------------------------------- 
101 | "a1", "a2", "a3" 
102 | "a2", "a3" 
103 | "a4", "a5" 

、同じ3つのキーの共通部分を取得すると、空のセットが返されます。

SINTER 101 102 103 
(empty list or set) 

私の目標は、ほとんどのセットに一致するメンバーを取得することです。これを達成するための方法はありますか?データセットが格納される方法を変えることができます。私。

また、このタスクに適している可能性のある別のキーストアを使用することはおそらく適切でしょうか?

+0

セットの場合はどう '101''設定、 'A'と 'B'が含まれています102' 'b'と' c'を含み、 '103'は' c'と 'd'を含んでいますか? –

答えて

2

AGGREGATE SUM引数を使用して、ソートされたセットに対してユニオン操作を実行できます。それは少しclunkyですが、それは動作します。基本的にスコア1のすべての要素を追加してから、スコアを合計して結合します。

結果セットは、少なくとも持つ要素に最も交点を持つ要素からソートされます。

127.0.0.1:6379> zadd foo 1 a 
(integer) 1 
127.0.0.1:6379> zadd foo 1 b 
(integer) 1 
127.0.0.1:6379> zadd foo 1 c 
(integer) 1 

127.0.0.1:6379> zadd bar 1 a 
(integer) 1 
127.0.0.1:6379> zadd bar 1 c 
(integer) 1 

127.0.0.1:6379> zadd baz 1 d 
(integer) 1 

# Now let's do the union and store it into "merged" 
127.0.0.1:6379> ZUNIONSTORE merged 3 foo bar baz AGGREGATE SUM 
(integer) 4 

# Merged is now sorted by common points 
127.0.0.1:6379> ZREVRANGE merged 0 -1 WITHSCORES 
1) "c" 
2) "2" 
3) "a" 
4) "2" 
5) "d" 
6) "1" 
7) "b" 
8) "1" 
127.0.0.1:6379> 
+0

ありがとう、これは素晴らしいです! –

+0

@Sævarあなたが多くの大きなセットを持っているなら、パフォーマンスはひどいことに留意してください。各セットのすべての要素をトラバースする必要があります。 –

+1

エレガントなソリューション!また、次の場合にも注意してください。マージされたセット内のすべてのアイテムのスコアは「1」です。 –