大家都对Google的suggest的功能大概很有兴趣吧,我们觉得既然Google做的出,那么我们也能做出来,先对其进行分析,1.对于网页客户端的按键的动态变化,Ajax是最好的选择,

2.如果数据库的选择,则可以有多种选择得,BerkeleyDB, Derby甚至自己做个txt文本文件,把所需要的单词和result数目放在文本文件里都能够实现,但今天我们有了一个很好的索引工具Lucene。加上Lucene对我的吸引力,因此今天我们用上大炮,卸去鸟枪。开始我们的开发之路。

首先,我们先建立个demo的框架,我就做了个这样的一个html文件,用了一个form,一个

输入的文本框,一个多选项和一个确认按键。后面两个没什么好说的,主要是文本框的设计,我做了以下的定义,<input  type="text" size=60 id="userid" name="q" autocomplete="off" onKeyUp="validate(event);"> 这样autocomplete=off指取消网页的cache,这样就不会弹出以前打过的字的窗口,造成混乱。onKeyUp是实现ajax的关键,相应键盘输入的操作。

其次,开始我们的Ajax了,顾名思义,Ajax指异步的javascript和xml. 我们的所有工作都会在javascript中完成,至于ajax原理,很多地方都有很详细的解释,这里就指列应用了。

 validate(e){

var key=e.KeyCode;  //获得输入的键值

  //定义按键只对字母数字,空格,回车,Ins和del有效,可以避免一些无效的相应,并//转发url给servlet,那么我们只要等servlet返回xml就可以了

  if (key>=48 && key<=90 || key==8 || key==32 || key== 45 || key==46){

       var url = "LuceneSearch?id=" + encodeURI(idField.value);

req.open("GET", url, true);

req.onreadystatechange = processRequest;

req.send(null);

}

}

这时,可以通过Ajax的3个req的请求进行向服务器发送,我们这里只要等待服务器返回的xml就可以了。

function processRequest(){

if(req.readyState==4){

if(req.status==200){

parseMessages();

}else{

clearTable();

}

}

}

这里我们通过返回的状态, 得到一个XmlHttp的readyState=4表示servlet的操作结束,status

=200则表示Http得到正常的返回,这时调用parseMessage()就可以对所得到的XmlHttp进行操作,

function parseMessages(){

var products = req.responseXML.getElementsByTagName("products")[0];

for (loop=0;loop<products.childNodes.length);loop++){

var product = products.childNodes[loop];

var productname = product.getElementsByTagName("pname")[0];

var productnumber = product.getElementsByTagName("pnumber")[0];

}

}

这里我们就在javascipt里就得到了我们所需要的词的name和number,然后就只要在javascript里填入一些特效,便能很方便的实现Google的suggest.

其次,我们所需要的就事编写我们现在的LuceneSearch的servlet. 这里因为通过get方式传递,这不对于开发j2ee的程序员来说,就是小菜一碟,我们只要定义doGet(req, res)就能可以了实现了。从这里我们得到了Text文本框里的字符串值。

public class LuceneSearch extends HttpServlet{

public  void doGet(HttpServletRequest request, HttpServletResponse  response)

throws IOException, ServletException {

String targetId = request.getParameter("id");

}

}

然后我们需要对这些字符串进行清理,去掉些无效的符号,然后把多余空格合并,成为一种真正的需要的字符串,然后我们需要用Lucene来进行搜索,先把Document把数据从数据库里读出来,然后制成Index。然后用Search来进行搜索,这里Lucene提供了很好的搜索方式,搜索分两种方式,一种是单个单词,这个就比较好办,Lucene 提供了开头匹配的方法PrefixQuery(), 直接套用就可以了

PrefixQuery query = new PrefixQuery(new Term("keyword", targetId));

IndexSearcher searcher = new IndexSearcher(directory);

Hits hits = searcher.search(query,sort);

for(int i=0; i<hits.length();i++){

sb.append("<product>");

sb.append("<pname>"+hits.doc(i).get("keyword")+"</pname>");

sb.append("<pnumber>"+hits.doc(i).get("number")+"</pnumber>");

sb.append("</product>");

}

这样我们就把搜索到的词和数量都放进Xml里了这样就出来了。

我们还可以注意到如果所需要的词并不在开头也能得到实现。

对于词组就比较费尽,因为首先要保证前面词的位置性,可以任意放置,最后一个词则必须以开头为基准进行模糊查找,这样才能实现其功能,还好Lucene还是考虑到了这点,有个PhrasePrefixQuery()的方法,稍稍加以改进便可以实现,

//首先要把词组用split以空格分开

String[] targetIdArray = targetId.split(" ");

PhrasePrefixQuery query = new PhrasePrefixQuery();

for(int i=0; i<targetIdArray.length-1;i++){

query.add(new Term("keyword",targetIdArray[i]));

}

query.setSlop(4);        //设置词前后位置移动范围。

LinkedList termsWithPrefix = new LinkedList();

IndexReader ir = IndexReader.open(directory);

TermEnum te = ir.terms(new Term("keyword", targetIdArray[targetIdArray.length-1]));

do {

if (te.term().text().startsWith(targetIdArray[targetIdArray.length-1])) {

termsWithPrefix.add(te.term());

}

} while (te.next());

这样我们先得到最后一个单词为开头的词,然后加到PrasePrefixQuery里

query.add((Term[])termsWithPrefix.toArray(new Term[0]));

Hits hits;

hits = searcher.search(query, sort);

for(int i=0; i<(hits.length()>20?20:hits.length());i++){

sb.append("<product>");

sb.append("<pname>"+hits.doc(i).get("keyword")+"</pname>");

sb.append("<pnumber>"+hits.doc(i).get("popularity")+"</pnumber>");

sb.append("</product>");

}

这样我们就可以得到我们所需要的词组了。如图所示,很方便吧,这里就基本完成了google

所代表的suggest功能,当然,javascript里面还有一些上下键,鼠标移动事件的触发,加在一起就会把我们的网页弄得很完美了。

关于Google的Suggest功能的实现相关推荐

  1. java suggest_一分钟学会实现Suggest功能的AJAX样例 | 学步园

    Ajax不是什么新鲜的技术,微软98年出的MSDN里面,就介绍了msxml,xmlhttpreuqest的远程读取xml文档的功能.只不过那个时候B/S技术远没有今天这么热,所以ajax被翻出来换了个 ...

  2. Google的非主流功能

    Google的非主流功能 来源:中国搜索引擎研究网 <script language="javascript" src="../count.asp?Filename ...

  3. Web ML+ WebAssembly 支持实现 Google Meet 背景模糊功能

    正文字数:2584  阅读时长:4分钟 从 mmhmm.腾讯会议.Zoom 到 Google Meet,背景模糊和特效已经成为视频会议或直播的一项标配.Google Meet团队通过 Web ML,M ...

  4. android 打开谷歌导航,国内开启google位置记录功能/android版google maps 7+上,恢复位置记录功能在国内使用(需root)...

    android版google 地图在 7以后的版本上,位置记录功能在国内不能用了,提示本功能不能在中国使用. 至少对本人,"位置记录"功能是非常有用的功能,尤其是骑车出行时记录自己 ...

  5. google浏览器 隐藏功能开启

    网址 chrome://flags/ 1,多线程下载 2,暗黑模式 3,标签缩略图 4,PWA 渐进式web应用 网页即应用 5,阅读模式,排除广告,点击阅读模式去除干扰 chrome://net-i ...

  6. java实现sug,Elasticsearch搜索Suggest功能优化

    搜索Suggest需要优化问题: 怎么优化Suggest词库,提升Suggest词准确率 怎么提高响应速度 suggest词库获取 冷启动可以从内容中提取热词数据来解决,或者人工设置 挖掘搜索日志: ...

  7. Google Play 新功能 | 让您的应用在 Play 商店中闪耀

    作者 / Allison Chang (Google Play 产品经理).Weifang Sun (ChromeOS 产品经理).Manuel Wang (Google Play 管理中心产品经理) ...

  8. Google地图新功能展示你所有旅程 诺基亚地图传被收购

    Google地图加入的历史定位功能,可以追踪手机装置所有去过的地方.当你开启"你的时间轴"(timeline),你不仅能查询所有旅行过的地点,而且可以看见如何到达这些地方,包括:飞 ...

  9. Google日历的功能

    使用 Google 日历,用户可从一个地方轻松管理日常生活中的各种重要事项.用户可轻松添加活动和发送邀请,与亲朋好友共享日程表,并搜索您感兴趣的活动. 1.  按日.按周或按月查看 用户可通过这些标签 ...

最新文章

  1. win8 网络 连接计算机名称,win8本地网络联接的名字怎么改
  2. 软件测试数据存储位置,关于数据存储类型的一点分析
  3. 北京大学计算机女博士经常看什么资料?
  4. Xamarin XAML语言教程ContentView视图作为自定义视图的父类
  5. 成功解决 raise XGBoostError(_LIB.XGBGetLastError()) xgboost.core.DMatrix/Booster has not been intialized
  6. 2010.11.13信息系统项目管理师考试下午试题答题思路剖析
  7. 表达式计算:后缀表达式求解 以及 中缀表达式转换为后缀表达式
  8. USACO 之 Section 2.3 (已解决)
  9. Asp.net导出Excel报表(解决无网格问题)
  10. “技术驱动创新”正成为企业发展新方向,开发者该如何修炼自己?
  11. win10录屏怎么用_怎么用Win10电脑系统进行录音教你两种简单实用的方法
  12. 第二阶段冲刺 站立会议 -01个人进度
  13. Hibdernate入门
  14. Ubuntu18 Cuda10升级Cuda11+Cudnn8+TensorRT7.1+Opencv3
  15. matlab中证券组合的收益,【证券投资组合分析】基于MATLAB的证券投资组合分析_玛雅作文网...
  16. 【车间调度】柔性作业车间调度问题的研究方法
  17. web项目中实现登陆成功后才能访问某些页面,否则自动跳转到登陆界面,以及对无限循环重定向的解决
  18. 劝人自杀情绪多变,人工智能真不是个“东西”
  19. 40 sinon spy间谍函数
  20. 计算机二级excel服装采购表,计算机二级excel真题:制作采购成本分析表

热门文章

  1. 3G技术的宠儿CDMA2000 1X
  2. 第十七天学习记录:工作相关:Qt控件设置setEnabled(false)的问题。
  3. 人机界面在石油钻井工程中的应用:如何搭建钻井工程参数监测系统?
  4. 使用sqlserver management studio创建新用户
  5. 全国大学英语竞赛备赛一定要看
  6. rust拆自己家门_rust 腐蚀 怎么拆门 | 手游网游页游攻略大全
  7. Poi 操作Word文档设置页边距 解决CTPageMar类找不到
  8. IDEA中spring框架快速搭建
  9. linux查看根目录所有磁盘空间,linux查看磁盘空间及处理方法
  10. 分析启用二级域名建站的好处与弊端