本站首页    管理页面    写新日志    退出


«August 2025»
12
3456789
10111213141516
17181920212223
24252627282930
31


公告
本博客在此声明所有文章均为转摘,只做资料收集使用。并无其他商业用途。

我的分类(专题)

日志更新

最新评论

留言板

链接

Blog信息
blog名称:
日志总数:210
评论数量:205
留言数量:-19
访问次数:918234
建立时间:2007年5月10日




[Compass]Compass 概述
文章收藏,  网上资源,  软件技术,  电脑与网络

李小白 发表于 2007/5/12 10:36:53

  版权声明:本文作者 江南白衣,Scheweigen(springside保留版权,转载请注明出处:http://wiki.springside.org.cn/display/springside/Compass500)this.width=500'>) 1. 概述     已加入Opensymphony的Compass 是对Lucene搜索引擎在企业应用(数据库相关应用)中的封装和增强。 Lucene本身的API已经非常简单,那Compass还能做什么样的增强呢?     心里数一下还是挺多的,不过可能只有一小部分适合自己的项目,在我的项目里最实际的增强就是索引的建立与Data Change Mirror的功能,其他功能用不用的上就要看缘分了。 1.1 参考资料      InfoQ:Compass: Integrate Search into your apps500)this.width=500'>  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>3.3 调用CompassGps.index()    上面的Gps定义只是自启动Mirror Data Change,但索引初始建立就需要靠程序员自己写代码调用CompassGps.index()来完成。    理论上,因为可以Mirror Data Change,所以索引只需要建立一次即可。如果索引已存在,Compass会对它gracefule override,所谓graceful,就是Compass会现在临时目录存放新的索引,新索引建立完毕后,再一次过覆盖旧索引,重建索引的漫长过程中,旧索引可以正常工作。    为了方便演示,在Bookstore示例里定义了一个CompassIndexBuilder,实现了Spring的InitializingBean接口,自动在Spring 启动时,启动一条线程进行索引重建。 4 Compass Highlighter 4.1  定义Highlighter 字段   只需要在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>


阅读全文(2948) | 回复(0) | 编辑 | 精华
 



发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.047 second(s), page refreshed 144759254 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号