查询Controller的编写
接下来是查询Controller:
@RequestMapping("/q") public String search(@RequestParam(value = "q", required = false,defaultValue = "") String q, @RequestParam(value = "page", required = false, defaultValue = "1") String page, Model model, HttpServletRequest request) throws Exception { LuceneIndex luceneIndex = new LuceneIndex() ; List userList = luceneIndex.searchBlog(q); /** * 关于查询之后的分页我采用的是每次分页发起的请求都是将所有的数据查询出来, * 具体是第几页再截取对应页数的数据,典型的拿空间换时间的做法,如果各位有什么 * 高招欢迎受教。 */ Integer toIndex = userList.size() >= Integer.parseInt(page) * 5 ? Integer.parseInt(page) * 5 : userList.size(); List newList = userList.subList((Integer.parseInt(page) - 1) * 5, toIndex); model.addAttribute("userList",newList) ; String s = this.genUpAndDownPageCode(Integer.parseInt(page), userList.size(), q, 5, request.getServletContext(). getContextPath()); model.addAttribute("pageHtml",s) ; model.addAttribute("q",q) ; model.addAttribute("resultTotal",userList.size()) ; model.addAttribute("pageTitle","搜索关键字'" + q + "'结果页面") ; return "queryResult"; }
其中有用到一个genUpAndDownPageCode()
方法来生成分页的Html代码,如下:
/** * 查询之后的分页 * @param page * @param totalNum * @param q * @param pageSize * @param projectContext * @return */ private String genUpAndDownPageCode(int page,Integer totalNum,String q,Integer pageSize,String projectContext){ long totalPage=totalNum%pageSize==0?totalNum/pageSize:totalNum/pageSize+1; StringBuffer pageCode=new StringBuffer(); if(totalPage==0){ return ""; }else{ pageCode.append(""); pageCode.append(""); if(page>1){ pageCode.append("• 上一页 "); }else{ pageCode.append("• 上一页 "); } if(page下一页"); }else{ pageCode.append("• 下一页 "); } pageCode.append(" "); pageCode.append(""); } return pageCode.toString(); }
代码比较简单,就是根据的页数、总页数来生成分页代码,对了我前端采用的是现在流行的Bootstrap,这个有不会的可以去他官网看看,比较简单易上手。接下来只需要编写显示界面就大功告成了。
显示界面
我只贴关键代码,具体的可以去Github上查看。
${q}未查询到结果,请换个关键字试试! 查询${q}关键字,约${resultTotal}条记录! ${u.username} ${u.description} ${u.password} ${u.password}
利用JSTL
标签即可将数据循环展示出来,关键字就不需要单独做处理了,在后台查询的时候已经做了修改了。
总结
关于全文检索的框架不止Lucene
还有solr
,具体谁好有什么区别我也不太清楚,准备下来花点时间研究下。哦对了,最近又有点想做Android
开发了,感觉做点东西能够实实在在的摸得到逼格确实要高些(现在主要在做后端开发),感兴趣的朋友可以关注下。哦对了,直接运行我代码的朋友要下注意:
- 首先要将数据库倒到自己的MySQL上
- 之后在首次运行的时候需要点击
重新生成索引按钮生成一遍索引之后才能进行搜索,因为现在的数据是直接存到数据库中的,并没有在新增的时候就增加索引,在实际开发的时候需要在新增数据那里再生成一份索引,就直接调用LuceneIndex
类中的addIndex
方法传入实体即可,再做更新、删除操作的时候也同样需要对索引做操作。