Compass 指南

转载 2007年09月30日 10:09:00

版权声明:本文作者 江南白衣,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>

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>
 

相关文章推荐

三分钟学会API接口设计 之 Compass 的Restful API 快速入门指南 -- 使用Flask框架

大部分开源框架基本上都是使用Curl + RPC的方式构筑系统,以提供对外\对内的交互能力。 这种设计,本人认为更多地是出于层次化与模块化设计的考量,简化整个架构,使得开发轻量简单化。 本文主要介绍C...

Compass学习指南

Compass是Sass的一个工具库,他们之间的关系就好像JavaScript和jQuery一样。学习Compass之前,你最好有一定的Sass基础。就好像你不会JavaScript一样可以使用jQu...

compass入门指南

  • 2013-01-16 10:56
  • 250KB
  • 下载

PhoneGap API帮助文档翻译—Compass(罗盘)

“   获得该设备的当前朝向。 方法: compass.getCurrentHeadingcompass.watchHeadingcompass.clearWatch ...

Sass和Compass设计师指南.pdf

  • 2015-10-03 22:12
  • 44.42MB
  • 下载

Android ApiDemos示例解析(61):Graphics->Compass

这个例子用到了SensorManager ,最好是在手机上测试。 SensorManager用于管理Android设备中的各种传感器,取的SensorManager实例对象的方法是使用getSyst...

Sass和Compass设计师指南

  • 2017-04-17 13:05
  • 44.42MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)