yyyyyyyyyyyyyyyyyyyy

博客园 首页 新随笔 联系 订阅 管理

 

 

目录(?)[+]

如何开发auto complete 智能提示功能

最近网上好像流传用redis实现,其实智能提示和用什么存储关系不大 07年,我过一个类似的项目

我有几千个名字,随着用户在输入框中不断输入汉字或者拼音,用一个下拉列表提示它可能的输入项

下拉框,选中状态,自然是用js做,这里主要讲一下后端代码怎么实现,原理很简单

这就是一个倒排索引表,我们要做的工作,主要是准备这个索引表的数据, 假设我有一个名字

鲁塔夫

第一步,为这个名字生成拼音,把汉字和拼音都放在一个文本文件里面,一行放一条

鲁塔弗
 lutaf

第二步,用最大前序法切词,具体来说,就是吧 “鲁塔弗”--切成 3行


 鲁塔
 鲁塔弗

lutaf 这个拼音也一样的切成下面的形状

l
 lu
 lut
 luta
 lutaf

然后用一个hash表来装载这些切好的“字段”,每个key对应的value自然就是“鲁塔夫”

  1. ds={}

  2. ds['鲁']='鲁塔弗'

  3. ds['鲁塔']='鲁塔弗'

  4. ds['鲁塔夫']='鲁塔弗'

  5. ds['l']='鲁塔弗'

  6. ....

  7. ds['lutaf']='鲁塔弗'

几千个名字都可以如法炮制,但是遇到有相同前缀的怎么办?比如 “鲁塔弗”和“鲁冰花” 都会命中


 l
 lu

很简单,把刚才的哈希表的value从字符串变成list即可,一个前缀对应一个列表,列表里面每个元素都是拥有这个前缀的名字,于是哈希表就变成下面这样

ds['鲁']=['鲁塔弗','鲁冰花','鲁智深','鲁大师']
 ds['lu']=['鲁塔弗','鲁冰花','鲁智深','鲁大师']

剩下的事情,就简单了,开发一个web应用,用户的request的参数就是用户当前的输入,然后在这个hash表里面查询,得到结果列表之后,用json encode之,render给用户即可

我当时的做法就是用web.py开发这个服务,hash表直接用的dbhash,用fastcgi的方式部署在nginx后面,非常简单

auto complete功能确实和用什么技术存储无关

这个项目的绝大部分代码都是用python开发的,为了降低维护难度,后来我要求一个菜鸟程序员把这个代码转换成php,存储直接用mysql就行

udpate

2013年,用nodejs重新做了一个智能提示 http://lutaf.com/223.htm


posted on 2016-01-22 00:45  xxxxxxxx1x2xxxxxxx  阅读(291)  评论(0编辑  收藏  举报