Redis 实现搜索关键词自动补全

一、字典型自动补全

Redis 的有序集合有一个特性:score 相同时,是按照字典顺序排序的。

如我们需要获取带有某个前缀的提示词,将每个关键词的前缀分别提取并存储在有序集合中,如:foobar,则将 (f,fo,foo,foob,fooba ... foobar$) ,最后一个 foobar$ 表示这是该词的结尾,$ 可以标记为词的结尾符

127.0.0.1:6379> zrange autoc 0 -1
 1) "b"
 2) "ba"
 3) "bar"
 4) "bar$"
 5) "f"
 6) "fo"
 7) "foo"
 8) "foo$"
 9) "foob"
10) "fooba"
11) "foobar"
12) "foobar$"

当我们如果需要获取 ba 开头的所有关键词,可以尝试使用有序集合实现:

127.0.0.1:6379> zrank autoc ba
(integer) 1
127.0.0.1:6379> zrange autoc 1 -1
 1) "ba"
 2) "bar"
 3) "bar$"
 4) "f"
 5) "fo"
 6) "foo"
 7) "foo$"
 8) "foob"
 9) "fooba"
10) "foobar"
11) "foobar$"

可在程序中通过判断或获取指定长度的集合,获取 bar$ 结尾之前的所有词。

二、topN 关键词自动补全

假设现在需要获取以 “n” 开头的10个热门提示词,则我们首先将所有的词存放在有序集合中,score都为0

127.0.0.1:6379> zrange prefix_n 0 -1
1) "near"
2) "nequ"
3) "netflix"
4) "news"
5) "newyork"

当prefix_n(以n为前缀的集合)这个有序集合一直小于一个阈值,如300时,则直接对某一个搜索词进行 score + 1

当集合大于一个阈值时,则删除score最低的member,然后对搜索词 score + 1

从统计学上来讲,每个对于sorted set中有300个member的前缀,就能得到TOP 5关键词。如果查询越频繁,它的得分越高,它最终被选中的概率也就越高。

 

参考:

https://www.jianshu.com/p/b9e7feba2a9c

http://oldblog.antirez.com/post/autocomplete-with-redis.html

你可能感兴趣的:(Redis)