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

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

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

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

鲁塔夫

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

鲁塔弗
lutaf

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


鲁塔
鲁塔弗

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

l
lu
lut
luta
lutaf

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

ds={}
ds['鲁']='鲁塔弗'
ds['鲁塔']='鲁塔弗'
ds['鲁塔夫']='鲁塔弗'
ds['l']='鲁塔弗'
....
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

本文地址: http://lutaf.com/71.htm 鲁塔弗原创文章,欢迎转载,请附带原文链接