2016-02-05 74 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

)根据您的客户端/编程语言,您可能需要以不同的方式准备查询,具体取决于它们的十六进制值。 。你在用什么? –