2016-02-05 72 views
0

我想創建一個基本的自動完成功能(我手動創建了下面的這些功能以便首先對它進行測試),但不知何故,我在添加一些鍵後沒有得到想要的結果。Redis的字典排序不起作用

我添加一個單詞的每個可能的版本,並用*標記它們的確切單詞(例如,如果返回10個鍵並且其中3個具有星號,則它們將被顯示爲建議),所以我可以之後查詢我的散列數據庫並獲得散列結果。

有幾個重複的入口嘗試,但因爲它爲它們返回整數0,所以我推測它們沒有被第二次添加。

我使用Redis的3.0.6

127.0.0.1:6379> zadd zset 0 b 
(integer) 1 
127.0.0.1:6379> zadd zset 0 ba 
(integer) 1 
127.0.0.1:6379> zadd zset 0 bar 
(integer) 1 
127.0.0.1:6379> zadd zset 0 bar* 
(integer) 1 
127.0.0.1:6379> zadd zset 0 f 
(integer) 1 
127.0.0.1:6379> zadd zset 0 fo 
(integer) 1 
127.0.0.1:6379> zadd zset 0 foo 
(integer) 1 
127.0.0.1:6379> zadd zset 0 foo* 
(integer) 1 
127.0.0.1:6379> zadd zset 0 foob 
(integer) 1 
127.0.0.1:6379> zadd zset 0 fooba 
(integer) 1 
127.0.0.1:6379> zadd zset 0 foobar 
(integer) 1 
127.0.0.1:6379> zadd zset 0 foobar* 
(integer) 1 

沒有問題爲止。 我想,隨着fo

127.0.0.1:6379> zrank zset fo 
(integer) 5 

它給5開頭的話,所以我用一個(如圖here如果我喜歡它右)增加和查詢所有鍵。

127.0.0.1:6379> zrange zset 6 -1 
1) "foo" 
2) "foo*" 
3) "foob" 
4) "fooba" 
5) "foobar" 
6) "foobar*" 

沒問題,我得到了預期的結果。

我一直在添加密鑰。

127.0.0.1:6379> zadd zset 0 a 
(integer) 1 
127.0.0.1:6379> zadd zset 0 b 
(integer) 0 
127.0.0.1:6379> zadd zset 0 c 
(integer) 1 
127.0.0.1:6379> zadd zset 0 fi 
(integer) 1 
127.0.0.1:6379> zadd zset 0 fil 
(integer) 1 
127.0.0.1:6379> zadd zset 0 filli 
(integer) 1 
127.0.0.1:6379> zadd zset 0 fillib 
(integer) 1 
127.0.0.1:6379> zadd zset 0 fillibo 
(integer) 1 
127.0.0.1:6379> zadd zset 0 filliboy 
(integer) 1 
127.0.0.1:6379> zadd zset 0 filliboya 
(integer) 1 
127.0.0.1:6379> zrank zset fo 
(integer) 14 

我做了另一個搜索。

127.0.0.1:6379> zrange zset 15 -1 
1) "foo" 
2) "foo*" 
3) "foob" 
4) "fooba" 
5) "foobar" 
6) "foobar*" 

再次確定。我不斷添加。

127.0.0.1:6379> zadd zset 0 d 
(integer) 1 
127.0.0.1:6379> zadd zset 0 e 
(integer) 1 
127.0.0.1:6379> zadd zset 0 x 
(integer) 1 
127.0.0.1:6379> zadd zset 0 y 
(integer) 1 
127.0.0.1:6379> zadd zset 0 z 
(integer) 1 
127.0.0.1:6379> zadd zset 0 filli* 
(integer) 1 
127.0.0.1:6379> zadd zset 0 filliboya* 
(integer) 1 

這是事情變得有趣的部分。我想要得到所有以filli開頭的單詞,但我不能。爲什麼?

127.0.0.1:6379> zrank zset filli 
(integer) 11 
127.0.0.1:6379> zrange zset 12 -1 
1) "filli*" 
2) "fillib" 
3) "fillibo" 
4) "filliboy" 
5) "filliboya" 
6) "filliboya*" 
7) "fo" 
8) "foo" 
9) "foo*" 
10) "foob" 
11) "fooba" 
12) "foobar" 
13) "foobar*" 
14) "x" 
15) "y" 
16) "z" 
127.0.0.1:6379> 
+0

你的期望/要求的輸出是什麼? – Amit

+0

@Amit,我試圖獲取所有以給定單詞開頭的記錄。在最後一個例子中,'filli'只能返回'filli,fillib,fillibo,filliboy,filliboya,filliboya *',但它返回16條記錄。 – salep

回答

2

所述詞典式排序工作,但你要求從會員你檢索到結束(-1)的整個範圍。由於Redis v2.8,您應該使用ZRANGEBYLEX命令來達到此目的。在你的情況下,它應該如下:

ZRANGEBYLEX zset [filli [filli\xff 
+0

非常感謝,但是當返回'filli'和'filli *'時,'ZRANGEBYLEX zset [fi [fi \ xff'只返回'fi',而我需要每個以fi開頭的單詞。這可能是什麼原因?當我們處理cli時逃脫只是appies? – salep

+0

啊,我解決了它。 'ZRANGEBYLEX zset「[fi」「(fi \ xff」' – salep

+1

)根據您的客戶端/編程語言,您可能需要以不同的方式準備查詢,具體取決於它們的十六進制值。 。你在用什麼? –