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
相关文章推荐
- Android控件使用—AutoCompleteTextView自动补全实现搜索功能
- JqueryUI AutoComplate实现文本框搜索,自动补全效果
- redis实战:使用redis实现自动补全
- 各大搜索引擎智能提示API (JSONP跨域实现自动补全搜索建议)
- 利用redis完成自动补全搜索功能(一)
- solr入门之拼音加汉字方式的搜索建议自动补全的不高效实现
- Redis实现自动补全
- 第三百六十八节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索的自动补全功能
- redis实战:使用redis实现自动补全
- AJAX实现类似百度的搜索提示,自动补全和键盘、鼠标操作
- 百度搜狗等搜索引擎智能提示(JSONP跨域实现自动补全搜索建议)
- easyUI实现类似搜索框关键词自动提示功能示例代码
- 百度搜狗等搜索引擎智能提示(JSONP跨域实现自动补全搜索建议)
- 利用redis完成自动补全搜索功能(三)
- 各大搜索引擎智能提示API(JSONP跨域实现自动补全搜索建议)
- 自动补全搜索实现
- ssh框架下实现百度搜索自动补全功能
- AJAX实现类似百度的搜索提示,自动补全和键盘、鼠标操作
- 百度搜狗等搜索引擎智能提示(JSONP跨域实现自动补全搜索建议)
- 百度等搜索引擎智能提示(JSONP跨域实现自动补全搜索建议)