用户在输入搜索关键词时,根据已经输入的部分,自动提示出后面可能需要输入的词,既减少了用户输入的劳动量,也可以提示用户当前有哪些备选,有效的降低输错的几率,提升搜索的体验。

在第一期中,我们做了一个汉字提示的功能,从User Log中提取出每天搜索频率最高的词,和这些词命中的搜索结果数,更新到服务器中,然后提供补全提示功能。数据每天凌晨增量更新一次,保证数据的实时性,相比其他产品的补全功能,我们的数据要及时准确的多。

系统结构:

系统的性能:

由于结构简单,使用UDP通信,后台全部使用内存树的结构,处理能力>3000个/秒

数据结构和算法:

1.原始数据   <<string keyword,int freq,int cnt>........>

keyword按照unsigned char建立节点:0~255 最多可以建立 255棵树

下层子节点按照1/4字节(0~16)建立子节点,主要是存储效率和查询效率上考虑,同时使用一个tag标识节点是否是最后一个节点

2.树结构示意图:

3.例如,原始数据中的字符串:我是中国人,分解后:0XA0B0C1D2...这样的十六进制串,按照2中的格式存储到树中

4.用户输入,用户每次按下键盘,触发js的keydown事件,发送一个请求到CGI,CGI将用户输入的内容送到SuggestSvr,suggestsvr分解用户输入串,根据编码去树中查询,最后将结果压入优先级队列中,返回搜索频率最高的前10个结果给用户,值得一提的是,我们对返回结果的用户的KeyWord做了分词处理,以保证用户的搜索结果更加丰富

在实际的运营环境中,我们从log中看到,用户直接输入拼音进行搜索导致失败的比率比较高,例如输入“shouji”来搜索“手机”,在上个版本中,我们做了一个优化,增加了对拼音的支持。

由于汉语的复杂性,支持拼音比仅仅支持汉字要复杂的多,即使在一些比较大型的搜索引擎上,不完善的地方也随处可见。

1.汉字到拼音映射表:

我们准备了一个基本词表,每个汉字->拼音的映射,词表非常小,只有几K,格式如下:

<拼音,汉字 freq,汉字 freq,汉字 freq>

例如<a 阿 13555 啊 13444 呵 13333......>

2.汉字短语到拼音的转化:

根据1中的映射表,我们可以建立这样一个二维数组:

char PY2HZ[65535][32]={.....}

一维下标表示一个汉字的编码,单个汉字是2字节组成,单个汉字的取值范围刚好在[0,65535],可以直接通过数组下标获取到汉字对应的拼音

3.建立索引:

1)针对用户日志中的keyword,首先转换成拼音

例如:我是中国人,根据每个汉字的编码获取到单个汉字的拼音,汉字直接用"‘"分隔,wo’shi‘zhong’guo‘ren

2)建内存树

以每个字母为一个节点建树,{a~z}{A~Z}最多64颗树,实际上远小于这个数字,一些不可见字符

typdef struct NODE{

char value;

Node *pBrother;

Node *pChild;

char  ctag;  //-3表示到达一个汉字拼音的结尾,-2表示当前节点的字母是一个声母

DocInfo *pDoc;//指向当前短语对应的文档列表,如果短语没有结束,指针为NULL

}Node,*pNode;

typdef DOCINFO{

int iDocId;

int iFreq;

}DocInfo,*pDocInfo;

结构示意图:“手表”和“手机”的存储结构

4)检索时同样把用户输入的拼音串在树中查找

几个挑战:

1.一字多音,例如阿,可以读a,可以读e,这就导致在二维数组中,对“阿”查找拼音的时候比较麻烦,这里的做法是根据频率选择一个搜索频率比较高的

2.同音短语,比如:手机和收集,对应的拼音都是"shou'ji",这种情况处理起来比较简单,在上面的Node结构中,有一个DocInfo *pDocInfo,以数组的方式记录了拼音对应的所有同音短语

3.简拼,比如:sj,对应的可能是"手机",“收集”,“四级"........这种情况,在上面的Node结构中,有一个ctag=-2标识声母,通过这种方式,可以很好的处理简拼

4.混拼,比如:nuojy,对应的是“诺基亚”,混拼的处理方式和简拼的方式比较类似

5.对于一些英文和拼音的处理,电子商务中包含很多英文名的商品名,如何区分英文和拼音还有简拼、混拼,其实这里的关键在于音节的划分,处理上没有太大的区别

SmartBox自动补全用户输入相关推荐

  1. Android 自动补全提示输入AutoCompleteTextView、 MultiAutoCompleteTextView

    以在搜索框搜索时,自动补全为例: 其中还涉及到一个词,Tokenizer:分词器,分解器. 上效果图: MainActivity.java: package com.joan.testautocoml ...

  2. PowerShell: 在自定义代码中支持Tab键自动补全

    大家好,我是码农杰克~ 在PowerShell中很多Cmdlet在输入参数时按tab键就可以可以自动补全,这是怎么做到的呢? 我们先来看个PowerShell自带命令:Test-Path 在Power ...

  3. Trie树实现前缀自动补全 + AC自动机实现敏感词过滤

    文章目录 背景 扩展 AC自动机 背景 最近参与了某业务系统的开发, 需要根据城市的名字简称,找到其官方的完整名称.比如云南的大理,其实其完整的名称是大理白族自治州.可以参考官方的行政区划,点这里. ...

  4. JS实现在输入框内输入@时,邮箱账号自动补全

    <!DOCTYPE HTML> <html lang="en"> <head> <meta charset="utf-8&quo ...

  5. MyEclipse的自动补全功能:输入@或者.没提示

    自动补全功能.一般默认的只有输入 . 的时候来才能自动提示. 配置方法: 1. 打开MyEclipse,然后"window"→"Preferences" 2. ...

  6. Solaris - 使用TAB键自动补全和显示当前用户与目录

    一.TAB键自动补全 习惯了其他Linux版本的自动补全,面对Solaris的这种情况,很是尴尬 通过修改如下配置: vi /etc/passwd 找到文件中第一行关于root用户的shell位 ro ...

  7. 英文输入时的自动补全功能

    以搜狗输入法为例,在中文输入状态下,右击搜狗自定义状态栏,将"英文输入(E)"点亮,即可实现英文输入的自动补全

  8. java输入代码快捷键是什么_eclipse自动补全代码快捷键是什么

    eclipse自动补全代码快捷键是空格键和回车键,补全代码功能需设置"Auto Activation triggers for java",代码提示选项补充完整后,输入关键字即可得 ...

  9. Android使用EditView输入框输入身份证时,自动补全身份证最后一位验证位

    Android使用EditView输入框输入身份证时,自动补全身份证最后一位验证位 下面直接贴出代码 //监听输入框文本长度,并自动补全身份证最后一位验证位 mEdit.addTextChangedL ...

最新文章

  1. 懂数学的程序员能有多吃香?这是我听过最好的答案丨颠覆认知
  2. 一起谈.NET技术,云计算和数据
  3. vue配置vue-router
  4. Gallery简单应用
  5. SnipperImages(Silverlight DEMO)控件设计之--Slider和ColorSlider
  6. 作为 IT 行业的过来人,你有什么话想对后辈说的?2
  7. python天气预报的功能介绍_python实现智能语音天气预报
  8. WinZip命令行详解
  9. 曝微软将发布基于 Excel 的低代码语言:Power Fx
  10. 最速下降法 理论证明
  11. [周更]5.unity3D 三体运动(简易版)
  12. D - Molar mass
  13. 关于前辈RPC学习的经验分享:我的DedSec RPC
  14. 你是自己的太阳,无需借别人的光(持续更新)
  15. S-AES的加密与解密
  16. 中国新四大发明背后的“数据智能”
  17. node卸载淘宝镜像
  18. openstack kilo版本,虚拟机无法ping通外网
  19. python匹配ip地址
  20. IEEE-Access 期刊投稿和回信再投稿步骤

热门文章

  1. linux netlink 机制,Linux Netlink 编程
  2. 教你去掉QQmusic的广告
  3. File类文件的切割与合并
  4. 走近所罗门 Part 1 邮件中的所罗门
  5. JS中的indexOf方法
  6. PHP+iis部署最干货的步骤
  7. html实现滑动解锁_js实现滑动解锁功能(PC+Moblie)
  8. 图片的MD5查询方式
  9. 你不得不了解的jvm知识,还不看?
  10. 阿帕奇退出java_阿帕奇欲退出Java委员会 甲骨文挽留