注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

无线时代辐射无穷

抓紧生宝宝,小心辐射

 
 
 

日志

 
 

Compass 指南  

2009-09-24 10:25:48|  分类: compass |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
1. 概述
    已加入Opensymphony的Compass 是对Lucene搜索引擎在企业应用(数据库相关应用)中的封装和增强。 Lucene本身的API已经非常简单,那Compass还能做什么样的增强呢?

    心里数一下还是挺多的,不过可能只有一小部分适合自己的项目,在我的项目里最实际的增强就是索引的建立与Data Change Mirror的功能,其他功能用不用的上就要看缘分了。

1.1 参考资料
    InfoQ:Compass: Integrate Search into your apps

1.2 What SpringSide Done
    SpringSide在core中仿照Compass的Spring MVC Controller封装了SearchService与Advanced SearchService,方便不使用Spring MVC的同志

    同时在书店示例中演示了图书搜索及结果关键字高亮,在Spring启动时建立索引并基于Hibernate event机制的自动索引更新。

2. Data Change Mirror功能
    DataMirror会把数据库的增删改变化实时映射到索引文件中。

    如果你采用Hibernate等ORM方案,Compass就会与Hibernate的event机制结合,或者使用AOP的方式,自动在数据库增删改时变更索引;如果你只是采用JDBC,也可以在XML文件配置Table Mapping或ResultSet Mapping,指定version列,Compasss定时对version列变化了的数据进行索引更新。

    而且,Compass还支持事务,在查询数据库遍历结果集的过程中如果出现异常,会在Index Segments 文件一级进行事务控制。

    如果没有Compass,我们一般会在每天深夜重建一次索引。相比Compass的做法,
    一来反应迟缓,平均延时半天;
    二来效率没有Compass高。如果采用完全重建索引,效率就不用说了。如果进行增量索引,就要增加一个字段,在数据更新时进行特殊的处理,删除时也不能直接删除数据,要等lucene删完索引数据才能删除,这样Lucene对应用就非常不透明了。
    三来不支持事务,如果建立索引过程中出现异常,索引文件的状态是不可控的。

3. Compass 下简化的索引建立过程
    在lucene 下建立索引的过程是自己用JDBC 跑.SQL 获得ResultSet,遍历ResultSet建立Document对象并用IndexWriter写入文件目录。

    在Compass下就变成一个宣告的过程:

3.1 宣告待搜索的POJO
Java代码 复制代码
  1. @SearchableId 宣告Document的id列;   
  2.   
  3. @SearchableProperty 宣告要索引的field;   
  4.   
  5. @SearchableComponent宣告关联其他对象如Category分类。  
   @SearchableId 宣告Document的id列;       @SearchableProperty 宣告要索引的field;       @SearchableComponent宣告关联其他对象如Category分类。


Java代码 复制代码
  1. public   class  Product  {   
  2.   @SearchableId  
  3.   private  Integer id;   
  4.   
  5.   @SearchableProperty  
  6.   private String name;   
  7.   
  8.   @SearchableComponent  
  9.   private Category category;   
  10.  }  
public   class  Product  {    @SearchableId    private  Integer id;      @SearchableProperty    private String name;      @SearchableComponent    private Category category;   }

3.2 定义CompassGps
      CompassGps是Compass下用来建立索引,Mirror Data Change的类。

      在ApplicationContext.xml定义了Compass与Spring的集成,配置参数,并让GPS随ApplicationContext启动开始监控Hibernate的DataChange :

Compass:核心定义类,定义要搜索的POJO 和 索引存储的路径。
CompassGPS: 定义使用了Hibernate3GPS,定义了init-method 和destory-method,会自动随ApplicaitonContext的启动,开始监控Hibernate的变化。
Java代码 复制代码
  1. <bean id="compass" class="org.compass.spring.LocalCompassBean">   
  2.     <!-- anontaition式设置 -->   
  3.     <property name="classMappings">   
  4.         <list>   
  5.             <value>org.springside.bookstore.model.Book</value>   
  6.             <value>org.springside.bookstore.model.Category</value>   
  7.         </list>   
  8.     </property>   
  9.   
  10.     <property name="compassConfiguration">   
  11.         <bean class="org.compass.annotations.config.CompassAnnotationsConfiguration"/>   
  12.     </property>   
  13.   
  14.     <property name="compassSettings">   
  15.         <props>   
  16.             <prop key="compass.engine.connection">   
  17.                 file://${user.home}/springside/compass   
  18.             </prop>   
  19.             <prop key="compass.transaction.factory">   
  20.                 org.compass.spring.transaction.SpringSyncTransactionFactory   
  21.             </prop>   
  22.         </props>   
  23.     </property>   
  24.   
  25.     <property name="transactionManager" ref="transactionManager"/>   
  26. </bean>   
  27.   
  28. <!-- Compass中建立索引与mirror database change的部件 -->   
  29. <bean id="compassGps" class="org.compass.gps.impl.SingleCompassGps"  
  30.           init-method="start" destroy-method="stop">   
  31.     <property name="compass" ref="compass"/>   
  32.     <property name="gpsDevices">   
  33.         <list>   
  34.             <bean class="org.compass.spring.device.hibernate.SpringHibernate3GpsDevice">   
  35.                     <property name="name" value="hibernateDevice"/>   
  36.                     <property name="sessionFactory" ref="sessionFactory"/>   
  37.             </bean>   
  38.         </list>   
  39.     </property>   
  40. </bean>   
<bean id="compass" class="org.compass.spring.LocalCompassBean">   <!-- anontaition式设置 -->   <property name="classMappings">    <list>     <value>org.springside.bookstore.model.Book</value>     <value>org.springside.bookstore.model.Category</value>    </list>   </property>     <property name="compassConfiguration">    <bean class="org.compass.annotations.config.CompassAnnotationsConfiguration"/>   </property>     <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>    <!-- Compass中建立索引与mirror database change的部件 -->  <bean id="compassGps" class="org.compass.gps.impl.SingleCompassGps"      init-method="start" destroy-method="stop">   <property name="compass" ref="compass"/>   <property name="gpsDevices">    <list>     <bean class="org.compass.spring.device.hibernate.SpringHibernate3GpsDevice">       <property name="name" value="hibernateDevice"/>       <property name="sessionFactory" ref="sessionFactory"/>     </bean>    </list>   </property>  </bean> 

只需要在AdvancedSearchCommand 上将需要highlighting 的Fields 加入即可。

searchCommand.setHighlightFields(new String[] {"name"});4.2 定义高亮的样式
另外,如果对高亮显示的效果不满意的话,可以在applicationContext-compass.xml 文件里配置:
Java代码 复制代码
  1. <prop key="compass.engine.highlighter.default.formatter.simple.pre">   
  2.      <![CDATA[<font color="red"><b>]]>   
  3.     </prop>   
  4.     <prop key="compass.engine.highlighter.default.formatter.simple.post">   
  5.      <![CDATA[</b></font>]]>   
  6.     </prop>  
  评论这张
 
阅读(1073)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017