Compass将lucene、Spring、Hibernate三者结合

本文介绍如何利用Compass框架快速实现基于Lucene的企业级搜索功能,并与Spring和Hibernate集成。通过注解方式配置对象与搜索引擎映射,展示具体配置步骤及如何扩展高级搜索功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.概述

Compass将lucene、Spring、Hibernate三者的起来,以很低很低的成本快速实现企业应用中的搜索功能。

HomePage: http://www.opensymphony.com/compass/ 

springside里用了compass来做图书搜索,快速建立的流程如下:

1.用简单的compass annotation把Book对象映射到Lucene。

2.配置compass默认提供的基于Spring MVC的Index Controller 和Search Controller。

3.编写查询结果的显示页面,将controller返回的变量显示出来。

 

2.Object/Search Engine Mapping的 Annotations配置

使用JDK5 的annotation 来进行OSEM(Object/Search Engine Mapping)比用xml文件按简单许多,下面就是简单的搜索类,可见@SearchableID, @SearchableProperty与@SearchableComponent 三个标记,分别代表主键、可搜索的属性与关联的,另一个可搜索的对象,另外Compass要求POJO要有默认构造函数,要实现equals()和hashcode():

详细请点击查看springside中的Product.javaBook.java, Category.java

 
 
public   class  Product  {     
    @SearchableId

    
private  Integer id;
    
private  Category category;
    
private  String name;
    
private  Double unitprice;

    @SearchableProperty(name 
=   " name " )
    
public  String getName() {
        
return   this .name;
    }

    @SearchableComponent (refAlias 
=   " category " )
    
public  Category getCategory() {
        
return   this .category;
    }

    
public  Double getUnitprice() {
        
return   this .unitprice;
    }

3. 与spring,hibernate集成配置

3.1 spring配置文件

hiberante中的sessionFactory,transactionManager相比大家也是轻车熟路了.这里还是带过(因为不牵扯稿费的问题吗^_^ ).compass已经对对spring集成做了很好的封装,让我们的使用更加简单,我们可以不为compass编写一行代码,就可以做完搜索引擎的检索.下面是compass在spring中的简明配置. 详情点击查看springside中的applicationContext-lucene.xml  :

 

< beans >
< bean  id ="annotationConfiguration"           class ="org.compass.annotations.config.CompassAnnotationsConfiguration" ></ bean >

< bean  id ="compass"  class ="org.compass.spring.LocalCompassBean" >
   
<!--  anontaition式设置      -->   
  
< property  name ="classMappings" >
     
< list >
        
< value > org.springside.bookstore.domain.Book </ value >
     
</ list >
  
</ property >

  
< property  name ="compassConfiguration"  ref ="annotationConfiguration" />

   
< property  name ="compassSettings" >
        
< props >
            
< prop  key ="compass.engine.connection" > file://${user.home}/springside/compass </ prop >
            
< prop  key ="compass.transaction.factory" > org.compass.spring.transaction.SpringSyncTransactionFactory </ prop >
        
</ props >
    
</ property >

   
< property  name ="transactionManager"  ref ="transactionManager" />
 
</ bean >
  
< bean  id ="hibernateGpsDevice"  class ="org.compass.spring.device.hibernate.SpringHibernate3GpsDevice" >
     
< property  name ="name" >
        
< value > hibernateDevice </ value >
     
</ property >
     
< property  name ="sessionFactory"  ref ="sessionFactory" />
 
</ bean >
< bean  id ="compassGps"  class ="org.compass.gps.impl.SingleCompassGps"  init-method ="start"  destroy-method ="stop" >
  
< property  name ="compass"  ref ="compass" />
  
< property  name ="gpsDevices" >
      
< list >
          
< ref  local ="hibernateGpsDevice" />
      
</ list >
  
</ property >
 
</ bean >
</ beans >


 

上面要留意的配置有:

annotationConfiguration: 使用annotation配置,指定要转换的POJO如Book
compass.engine.connection : 索引文件在服务器上的存储路径.
hibernateGpsDevice: 与hibernate的绑定,用Hibernate 3 事件系统,支持Real Time Data Mirroring .经Hiberante的数据改变会自动被反射到索引里面.

3.2 web Controller的配置

两个Controller都是现成的,只要配置相关选项即可。

详情请查看springside的bookstore-servlet.xml

 
< bean  id ="indexBookController"  class ="org.compass.spring.web.mvc.CompassIndexController" >
   
< property  name ="compassGps"  ref ="compassGps" />
    
< property  name ="indexView"  value ="/admin/indexBook.jsp" />
    
< property  name ="indexResultsView"  value ="/admin/indexBook.jsp" />
</ bean >
< bean  id ="searchBookController"  class ="org.compass.spring.web.mvc.CompassSearchController" >
   
< property  name ="compass"  ref ="compass" />
   
< propertyname ="searchView" value ="/home/top.jsp" />
   
< property  name ="searchResultsView"  value ="/home/searchBook.jsp" />
   
< property  name ="pageSize"  value ="5" />
</ bean >

3.3 View JSP

  简单搜索页面:只需要一个query 参数:
<INPUT type="text" size="20" name="query"> 

结果页面:

结果页面将返回几个变量,包括:

searchResults(搜索结果) 包括hits(结果)和 searchtime(耗时)
    pages(分页信息) 包括page_from page_to等
    command(原来的查询请求)

具体使用见springside的advancedSearch.jsp ,下面是简版的代码:

 
< c:if  test ="${not empty searchResults}" >
       耗时: 
< c:out  value ="http://www.zhmy.com/${searchResults.searchTime}" /> ms
       
< c:forEach  var ="hit"  items ="${searchResults.hits}" >
             
< c:choose >
                   
< c:when  test ="${hit.alias == 'book'}" >
                         
< div  class ="left_content" >
                                 
< href ="#"  class = "title" >  《${hit.data.name}》 </ a >
                                 
< br />  作者:${hit.data.author} < br />
                        
</ div >
                    
</ c:when >
              
</ c:choose >
        
</ c:forEach >
</ c:if >

4.扩展高级搜索

扩展高级搜索其实很简单,SpringSide已经初步封装了加入包含以下任意单词,不包含以下任何单词,分类选择等条件及每页显示条数的确定。

如果需要更多条件:

1. 加强搜索页面,加入更多条件的显示。

2. 扩展compass的command class,接受从搜索条件页传过来的条件。 可从springside的AdvancedSearchCommand  扩展或从Compass的原类扩展。

3. 扩展compass的searchController, 将command中的变量重新处理为一个符合Lucene语法规则的query变量 即可(见springside中的AdvancedSearchController ),同时可以为搜索条件页查询图书分类列表一类的变量。

   你可以从springside的AdvancedSearchController扩展,重载onSetupCommand (),参考父类的做法,加装自己的条件。重载referenceData(),把图书分类列表这种条件加入到AdvancedSearchCommand 的referenceData Map中供搜索条件页显示,例子见BookSearchController

也可以参考BookSearchControllerAdvancedSearchController的做法,完全自行扩展。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值