如何使用Redis ZRANGEBYLEX实现自动完成搜索?

13

我正试图制作一个简单的自动完成系统,就像这里的演示一样:http://autocomplete.redis.io/,但由于某些原因,我无法使ZRANGEBYLEX返回正确的结果。以下是我在Redis CLI上执行的操作:

> zadd autocomplete 0 one 0 two 0 three 0 four 0 five 0 six 0 seven 0 eight 0 nine 0 ten 0 eleven 0 twelve 0 thirteen 0 fourteen 0 fifteen

我的套装看起来很不错:

> zrangebylex autocomplete - +
1) "eight"
2) "eleven"
3) "fifteen"
4) "five"
5) "four"
6) "fourteen"
7) "nine"
8) "one"
9) "seven"
10) "six"
11) "ten"
12) "thirteen"
13) "three"
14) "twelve"
15) "two"

如果我像这样使用ZRANGEBYLEX,那么结果就有意义:

zrangebylex autocomplete [e [eight
1) "eight"

但是,如果我想获取集合中所有以 "e" 开头的项目,我尝试了这个(与自动完成演示非常相似),但它没有返回正确的结果:

但是,如果我想要获取所有以 "e" 开头的集合项,我会尝试这样做(与自动补全演示非常相似),但它没有返回正确的结果:

> zrangebylex autocomplete [e [e(0xff)
(empty list or set)

使用什么参数才能使ZRANGEBYLEX命令匹配以"e"开头的任何字符串和随后的任何内容?

1个回答

19

这样就可以解决问题:

127.0.0.1:6379> zrangebylex autocomplete [e "[e\xff"
1) "eight"
2) "eleven"

编辑:如下方评论中Itamar Haber所指出的,当使用代码客户端时,您不需要引号。


确实如此。引号具体起到什么作用? - Glen Selle
3
强制redis-cli将值视为字面字符串。但是在代码中使用常规客户端时,不需要引号。 - Itamar Haber
@ItamarHaber,\xff的意思是什么?我不理解。 - BlackMamba
1
反斜杠(\)是转义字符,'x'表示十六进制字符表示法,'ff'在16进制中表示255。因此,'\xff'是最大的(按字典顺序)字符。 - Itamar Haber
有一些可能不太明显的事情 - 如果你只是使用 [ez 而不是 [e\xff,你将无法在结果中包含带撇号的字符串,比如 e'vret。 - nemaroller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接