compass 简单教程

引用URL
http://wiki.springside.org.cn/display/springside/Compass

内容:
版权声明:本文作者 江南白衣,Scheweigen(springside保留版权,转载请注明出处:http://wiki.springside.org.cn/display/springside/Compass)
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

@SearchableId 宣告Document的id列;

@SearchableProperty 宣告要索引的field;

@SearchableComponent宣告关联其他对象如Category分类。

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的变化。

<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 文件里配置:

<prop key="compass.engine.highlighter.default.formatter.simple.pre">
<![CDATA[<font color="red"><b>]]>
</prop>
<prop key="compass.engine.highlighter.default.formatter.simple.post">
<![CDATA[</b></font>]]>
</prop>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值