Redis词典排序并不起作用

时间:2016-02-05 08:41:48

标签: 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

它给出五个,所以我递增一个(如果我正确的话显示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>

1 个答案:

答案 0 :(得分:2)

字典排序正在起作用,但是您要求从您检索到的成员到结尾的整个范围(-1)。从Redis v2.8开始,您应该使用ZRANGEBYLEX命令来实现此目的。在您的情况下,它应该如下:

ZRANGEBYLEX zset [filli [filli\xff