`
shendaiming
  • 浏览: 13568 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

借助Play!framwork,lucene,taobao kissy 实现完整的前后端suggest功能

阅读更多


   我是基于Play!framework开发的网站 想了解童鞋可以看看http://www.iteye.com/topic/806974这篇帖子,目前最新版本是1.1,还有童鞋没听说过play!framework吗?简单的科普一下(以下内容来自于互联网):
引用
Play Framework是一个功能完整的Java Web开发框架。采用RESTful架构设计,简便灵活。Play Framework使用MVC模式作为Web层,集成JPA构建持久层,Play Framework还使用一个基于Groovy的模板引擎。
其特征如下:
   1.  Play Framework让开发者无须重新编译打包发布应用,即可看到修改后的效果,方便开发人员调试应用。
   2. Play!Framework采用了无状态模型,是一个真正意义上的“无共享”系统,能够在多个服务器上部署多个Play!Framework的实例,所有实例都不会互相干扰。
   3. Play!Framework采用了Groovy作为模板引擎,让表示层真正做到了开发高效简洁
   4. Play!Framework拥有精确的错误定位机制,当错误发生的时候,可以精确的定位到错误代码的位置。
   5. Play!Framework的速度很快,启动快,运行的速度也十分快。

   官方网站是: [url]http://www.playframework.org/  [/url]  再广一个告:中文社区http://www.daocaozhu.com/ (刚开始弄,还希望喜欢play的童鞋一块在这里交流play!framework的使用心得,为play!framework在中国的发展贡献你的力量)
回到正题上来:要实现这样的效果,我们都知道需要两个必不可少的工具:
   1、前端suggest组件;2、中文分词以及全文检索
   Suggest组件我选择了淘宝UED团队开发的开源js库:Kissy 官方网站是:[url]https://www.github.com/kissyteam/kissy   [/url]为什么选择kissy呐,我主要是被它的suggest组件还有图片轮换的组件所吸引,而且是淘宝UED团队开发的,质量上应该有保证,当然用起来确实也不错,虽然在选型上有些激进^_^。
  全文检索毫无疑问是lucene,中文分词我用的是庖丁解牛(感谢作者的贡献)。
Play提供了很多module,而集成lucene我们就需要用到search-module:http://www.playframework.org/modules/search   使用方法很简单,下载search-module到你Play目录下的modules文件夹里(不过好像play的安装包里已经带了,忘记了^_^),然后在你项目的配置文件application.conf中 

  去掉标注为红色的那一行前面的#号,如果你将你的项目部署到服务器上,而你的服务器上没有play安装包,那你可以把search包直接放到你的项目WEB-INF(把项目打成war后)路径下,这儿改为:module.search=../search,这样就不会有找不到search module的错误了。
  Search module已经配置好了,那我们就完整的实现这个小东西:前端的东西基本上引入kissy的主文件和kissy suggest 就行(当然还少不了必要的css^_^)。我们这儿为:
 
Java代码
<script type="text/javascript" src="@{'public/javascripts/kissy/kissy.js'}"></script>      
<script type="text/javascript" src="@{'/public/javascripts/kissy/suggest.js'}"></script>   

然后查询控件为:

Java代码
<form id="J_TSearchForm" action="@{Shops.search()}" name="search" target="_top">  
            <div class="tsearch-panel-fields "> 
        <label for="q" class="">输入您想要的商品名称</label> 
        <input name="q" id="q" autocomplete="off" accesskey="s"> 
         <s class="rc-tp-l"></s> 
         <s class="rc-bt-l"></s> 
    </div> 
    <button type="submit">搜索</button>  
</form> 

代码很眼熟?好吧,我承认,我山寨的taobao的…..
加入Js 代码:

Java代码
KISSY.ready(function(S) { 
   var sug = new S.Suggest('#q', "@{Shops.searchSuggest()}", { 
         autoFocus: true, 
         resultFormat: '约%result%个宝贝' 
     }); 
}); 

   开始说说后端实现的思路:  首先我们需要建立一个搜索词的词库。这个词库包含的内容有 1、检索词  2、检索次数(用于实现哪个词热度排序)3、检索词的拼音缩写版  用于输入个拼音也能给出提示。

首先说下模型类

这儿我们主要用到了两个实体:Product(商品对象)  SearchIndex(搜索建议词对象)

Java代码
@Entity 
@Indexed 
public class SearchIndex extends Model{ 
 
    @Field 
    public String name;//关键词 
     
    @Field 
    public long searchTimes;// 搜索次数 
     
    @Field 
    public String pinyin;//拼音版 
     
    public SearchIndex(String name){ 
        this.name = name;        
        this.pinyin = Tool.cn2Spell(name); 
        save(); 
    } 

  上面是SearchIndex的大部分代码。大体说下:@Index表示这个类可以需要lucene建立索引,继承的Model类是play对CRUD的大部分封装,是以JPA为基础作的富血的Domain Model的基类。然后@Field注解表示需要索引的字段。  在构造方法中,有Tool.cn2Spell这一句,使用了Pinyin4j做的从汉字到拼音简写的转换。这段代码网上找的,我就不贴出来了。

   然后说下搜索词的词库的建立:这儿我们主要是把商品名给分词后保存到词库中建立的搜索提示词的词库。在Product的构造方法里我们加了这么一句:
 
Java代码
this.addToIndexStore(name); 

这个方法的实现为:
Java代码
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(); 
    } 


  这儿我们用到了庖丁解牛的中文分词。Search module默认使用的分词是lucene自带的那个StandardAnalyzer,这个在处理中文上还无法满足我们的需要,所以我选用了社区中比较知名的庖丁解牛,事实上开始我选的是IK Analyzer的,但一直没有找到合适匹配Play自带的lucene的版本 ^_^ 。下载庖丁http://code.google.com/p/paoding/  因为我使用的play版本是1.0.3 其中自带的lucene版本是2.3.1  所以我们下载庖丁用那个paoding-analysis-2.0.4-beta.zip 即可 
还需要更改一下search module默认的分词:找到application.conf: 加入下面两句
Java代码
play.search.reindex=enabled 
play.search.analyser=net.paoding.analysis.analyzer.PaodingAnalyzer 

第一句的作用官方文档是这样解释的:



  然后我们再来看看上面包含代码的那个图中的代码:分词的那一句是:
   Tool.paodingAnalyzerWord:看代码:
Java代码
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; 


这段代码实现了中文分词,基本上没有啥需要解释的。
然后我们遍历分出来的词,查询下这个词是不是已经存在,存在的话就不用理它,不存在的话就加入到检索词词库中。这儿我都是和数据库直接交互,可能性能上会有问题,所以我们可以把搜索词全部加载到缓存中再做处理。

这样搜索建议词的词库就建立好了。

然后我们看看Shops.searchSuggest(上图中搜索form提交的地方)方法的实现:
Java代码
   /**
    * 商品搜索提示
    */ 
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,.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("\"", "\'")+"})"); 


  解释下上面的代码:

  第一句中的Search.Query是search module中的类,主要是对lucene操作的一些封装。Search.search()中的第一个参数是lucene查询表达式。这儿表示以name或者pinyin这两个字段进行匹配查询。这个查询用于查找用户输入字的相关搜索词(suggest)。

   下面的for循环用于查询匹配这个搜索词的商品的数量。
最后返回json:注意,这儿返回的JSON串都必须是单引号包括。比如{‘name’:’zhangsan’}这种。

   这样基本上就完成了一个简单的search suggest  功能。写的比较繁杂,主要是为了力求把事情说清楚,同时掺杂了一些play的使用说明。本文主要目的是向大家展示Play!framework的灰常好用,由于个人水平有限,极有可能存在不合适的地方,所以本文参考为主,不对的还请大家多多指教。
分享到:
评论

相关推荐

    lucene-suggest-7.7.0-API文档-中文版.zip

    赠送jar包:lucene-suggest-7.7.0.jar; 赠送原API文档:lucene-suggest-7.7.0-javadoc.jar; 赠送源代码:lucene-suggest-7.7.0-sources.jar; 赠送Maven依赖信息文件:lucene-suggest-7.7.0.pom; 包含翻译后的API...

    Lucene5学习之Suggest关键字提示

    Lucene,作为Java领域最流行的全文检索库,其5.x版本引入了Suggest组件,用于实现这种功能。本文将详细解析Lucene5中的Suggest技术,探讨其原理、实现方式以及如何在实际项目中应用。 首先,我们理解Suggest的基本...

    lucene-suggest-6.6.0-API文档-中文版.zip

    赠送jar包:lucene-suggest-6.6.0.jar; 赠送原API文档:lucene-suggest-6.6.0-javadoc.jar; 赠送源代码:lucene-suggest-6.6.0-sources.jar; 赠送Maven依赖信息文件:lucene-suggest-6.6.0.pom; 包含翻译后的API...

    Play-Framework-ElasticSearch-Module

    总之,Play-Framework-ElasticSearch-Module为开发者提供了一个高效、便捷的方式来整合Play Framework与Elasticsearch,极大地提升了数据处理和搜索功能,是学习Java开发框架及搜索技术不可或缺的宝贵资源。

    使用zend Framework的lucene进行全文检索

    在本文中,我们将探讨如何使用Zend Framework的Lucene模块进行全文检索,特别是针对中文分词的处理。全文检索是提高网站或应用搜索功能的关键技术,它允许用户输入任意词汇,系统能够快速找到与之相关的内容。Zend ...

    lucene-suggest-6.6.0

    lucene-suggest-6.6.0完整包,包含demo和技术文档,core文件夹中是核心包,有些功能需要引用各文件夹中的其他jar包

    lucene自定义排序实现

    因此,了解如何在 Lucene 中实现自定义排序是非常关键的。在这个话题中,我们将深入探讨如何根据特定的业务需求对搜索结果进行定制排序。 首先,我们要明白 Lucene 默认的排序机制。默认情况下,Lucene 搜索结果是...

    C#调用Lucene方法-实现快速搜索

    为了在C#中使用Lucene,我们需要借助.NET上的Lucene.NET,这是一个与Java Lucene兼容的.NET框架版本。 接下来,我们探讨C#调用Lucene的步骤: 1. **引入Lucene库**:在C#项目中,首先需要添加对Lucene.NET的引用。...

    Lucene 搜索方法(模糊搜索)

    在Lucene中,我们可以通过`FuzzyQuery`类来实现这种功能。`FuzzyQuery`基于Levenshtein距离算法,该算法计算两个字符串之间的差异程度,用于衡量它们的相似性。 首先,我们需要了解如何创建一个`FuzzyQuery`。在`...

    使用compass+lucene实现简单的全文检索功能

    本文将详细介绍如何使用 Compass 和 Lucene 实现一个简单的全文检索功能。 首先,Lucene 是一个高性能、全功能的文本分析库,主要用于信息检索。它提供了索引和搜索大量文本数据的能力,包括分词、分析、存储和搜索...

    Lucene与SSH2搜索功能

    通过这种方式,开发者可以利用SSH2的强大功能构建一个完整的Web应用,并借助Lucene实现高效的全文搜索。这种集成方式不仅可以提高应用的用户体验,还能在大型数据集上实现快速、精确的搜索。在实际开发中,还需要...

    Lucene的原理完整版pdf

    例如,假设你正在构建一个博客平台,可以使用Lucene来实现全文检索功能。每个博客文章作为一个文档,包含标题、内容和作者等字段。用户输入搜索关键词后,Lucene会快速找出所有相关文章,并按照相关性排序返回给用户...

    google suggest 的实现

    Lucene 是一个开源的全文检索引擎工具包,它提供了高度可定制化的搜索功能,是实现 Google Suggest 后端逻辑的关键组件之一。 1. **索引建立**: - 首先需要根据文档内容建立索引。 - 可以选择使用数据库(如 ...

    基于Lucene 7.1.0 实现搜索引擎

    最受欢迎的java开源全文搜索引擎开发工具包。提供了完整的查询引擎和索引...Lucene的目的是为软件开发人员提供一个简易用的工具包,以方便在目标系统中实现全文检索功能,或者是以此为基础建立起完整的全文检索引擎。

    lucene-4.0.0完整包

    - **知识库搜索**: 知识库、问答平台等也可以利用Lucene实现高效的内容检索。 - **日志分析**: 在日志分析系统中,Lucene 可帮助快速定位和分析关键事件。 总之,Lucene 4.0.0 是一个强大且灵活的全文检索引擎工具...

    lucene-suggest-7.2.1-API文档-中文版.zip

    赠送jar包:lucene-suggest-7.2.1.jar; 赠送原API文档:lucene-suggest-7.2.1-javadoc.jar; 赠送源代码:lucene-suggest-7.2.1-sources.jar; 赠送Maven依赖信息文件:lucene-suggest-7.2.1.pom; 包含翻译后的API...

    Lucene全文检索引擎

    Lucene提供了完整的搜索功能实现,包括索引创建、文档存储、查询解析和结果排序等。它的设计目标是让开发者能够轻松地在应用中加入高级全文检索功能。 **一、Lucene的基本概念** 1. **文档(Document)**:在...

    Lucene4.X第九讲-Lucene搜索深入实战

    最后,虽然Lucene使用Java语言写成,但是开放源代码社区的程序员正在不懈的将之使用各种传统语言实现(例如.net framework[14]),在遵守Lucene索引文件格式的基础上,使得Lucene能够运行在各种各样的平台上,系统...

Global site tag (gtag.js) - Google Analytics