借助Play!framwork,lucene,taobao kissy 实现完整的前后端suggest功能
先上效果图:
我是基于Play!framework开发的网站 想了解童鞋可以看看http://www.iteye.com/topic/806974这篇帖子,目前最新版本是1.1,还有童鞋没听说过play!framework吗?简单的科普一下(以下内容来自于互联网):
去掉标注为红色的那一行前面的#号,如果你将你的项目部署到服务器上,而你的服务器上没有play安装包,那你可以把search包直接放到你的项目WEB-INF(把项目打成war后)路径下,这儿改为:module.search=../search,这样就不会有找不到search module的错误了。
Search module已经配置好了,那我们就完整的实现这个小东西:前端的东西基本上引入kissy的主文件和kissy suggest 就行(当然还少不了必要的css^_^)。我们这儿为:
<script type="text/javascript" src="@{'public/javascripts/kissy/kissy.js'}"></script> <script type="text/javascript" src="@{'/public/javascripts/kissy/suggest.js'}"></script> <form id="J_TSearchForm" action="@{Shops.search()}" name="search" target="_top"> <div id="q" autocomplete="off" accesskey="s"> <s name="code"> KISSY.ready(function(S) { var sug = new S.Suggest('#q', "@{Shops.searchSuggest()}", { autoFocus: true, resultFormat: '约%result%个宝贝' }); });@Entity@Indexedpublic class SearchIndex extends Model{@Fieldpublic String name;//关键词@Fieldpublic long searchTimes;// 搜索次数@Fieldpublic String pinyin;//拼音版public SearchIndex(String name){this.name = name;this.pinyin = Tool.cn2Spell(name);save();}this.addToIndexStore(name);
public static void addToIndexStore(String productName){try {List<String> list =Tool.paodingAnalyzerWord(productName);for(String str:list){if(!SearchIndex.isExsist(str)){new SearchIndex(str);Logger.info("SearchIndex 添加索引:", str);}}} catch (IOException e) {e.printStackTrace();}}play.search.reindex=enabled play.search.analyser=net.paoding.analysis.analyzer.PaodingAnalyzer

public static List<String> paodingAnalyzerWord(String word) throws IOException{ PaodingAnalyzer analyzer = new PaodingAnalyzer(); StringBuilder sb = new StringBuilder(); TokenStream ts = analyzer.tokenStream("", new StringReader(word)); Token token; sb.setLength(0); ArrayList<String> results = new ArrayList<String>(); while ((token = ts.next()) != null) { sb.append(new String(token.termBuffer()).trim()).append('/'); results.add(new String(token.termBuffer()).trim()); } if (sb.length() > 0) { sb.setLength(sb.length() - 1); } return results;} /** * 商品搜索提示 */public static void searchSuggest(String q) throws IOException{Search.Query query = Search.search("name:"+q.trim()+"* OR pinyin:"+q.trim()+"*", SearchIndex.class);List<SearchIndex> list =query.orderBy("searchTimes").reverse().page(0, 8).fetch();List<String[]> results = new ArrayList<String[]>();for(SearchIndex si:list){ Search.Query q2=Search.search("name:"+si.name+"*",Product.class); String[] str ={si.name,String.valueOf(q2.count())}; results.add(str);}String result =new Gson().toJson(results);renderJSON("KISSY.Suggest.callback({'result':"+result.replace(""", "\'")+"})");}