Redis 实现中文自动补全方案
本文的自动补全只指最前匹配
常用的方案有哪些?
利用数据库的模块匹配来做,利如mysql的like %这种方式来完成,虽然最前匹配能保证用到索引,但是效率不高。
利用搜索引擎,比如elasticsearch,sphinx 一般都用此方案
通过redis的有序集合来实现(本文)
1.Redis 自动补全功能介绍:
Redis 可以帮我们实现很多种功能, 今天这里着重介绍的是 Redis 的自动补全功能的实现. 我们使用有序集合,并 score 都为 0,这样就按元素值的字典序排序. 然后我们可以根据排序号的字符, 进行添加前缀和后缀的方式, 找到我们想要的区间内容. 下面介绍一个简单的 Zset 的排序内容和思路, 以便后续的理解:
当所有的数值分值为0的时候,Zset会按照字典升序排列,这里我们如果需要查找上面的a,就应该能找出[ a, ab,abcd,abef]这四个元素,查找上面的ab,就应该能找出[ab,abcd,abef]这三个元素,其他同理.这个时候我们只要想办法在这个搜索条件查找元素的前面后最后都筛选出想要的数据即可:
- Ascii码里小写字母a的前面是`,z的后面是{
- 于是我们查找ab匹配的元素,插入 aa{ 和 ab{ 即可( 或者" ab` “和” ab{ " )
- 找到aa{ 和 ab{ 的下标,通过Zrange()得出相关区间的内容
- 如果是中文,建议全部将支付转为16进制字符来进行存储,取出时候再转码
实现原理
-
拆分词,加入到有序集合,注意添加到redis时score都设置为0,这些字符就会按照自然排序排好。
zadd demo 0 内容
-
利用zrank命令,定位关键字的位置索引,然后通过索引来获取所有以关键字开头的集合
zrank demo 关键字
<