标签:
最近网上好像流传用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就行
2013年,用nodejs重新做了一个智能提示
http://lutaf.com/223.htm
标签:
原文地址:http://www.cnblogs.com/timdes/p/5150086.html