您的位置:首页 > 数据库 > Redis

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

2019-04-01 14:17 330 查看
版权声明:@潘广宇博客, https://blog.csdn.net/panguangyuu/article/details/88946609

一、字典型自动补全

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

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

[code]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 开头的所有关键词,可以尝试使用有序集合实现:

[code]127.0.0.1:6379> zrank autoc ba
(integer) 1
[code]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

[code]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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: