Redis 实现中文自动补全方案

本文介绍了如何使用Redis的有序集合实现中文自动补全功能。通过将内容转化为16进制并以0作为score,可以实现字典序排序。在Java中,由于Redis不直接支持中文存储,需要进行编码转换。利用ZADD、ZRANK和ZRANGE命令定位和获取以特定前缀开始的元素。
摘要由CSDN通过智能技术生成

Redis 实现中文自动补全方案

本文的自动补全只指最前匹配
常用的方案有哪些?

利用数据库的模块匹配来做,利如mysql的like %这种方式来完成,虽然最前匹配能保证用到索引,但是效率不高。
利用搜索引擎,比如elasticsearch,sphinx 一般都用此方案
通过redis的有序集合来实现(本文)

1.Redis 自动补全功能介绍:

​ Redis 可以帮我们实现很多种功能, 今天这里着重介绍的是 Redis 的自动补全功能的实现. 我们使用有序集合,并 score 都为 0,这样就按元素值的字典序排序. 然后我们可以根据排序号的字符, 进行添加前缀和后缀的方式, 找到我们想要的区间内容. 下面介绍一个简单的 Zset 的排序内容和思路, 以便后续的理解:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qdHwkIcY-1629878678773)(media/16298777677459/16298781352389.jpg)]

当所有的数值分值为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 关键字

    <
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值