compass 的一些理解 ,转载http://zhangljerry.javaeye.com/blog/112580
来源:互联网 发布:乌恰县网站域名官网 编辑:程序博客网 时间:2024/04/29 19:37
http://zhangljerry.javaeye.com/blog/112580
理解Compass的配置文件
Compass是建立在Lucene基础之上的一款开放源码的JAVA搜索引擎框架。关于Compass的介绍在此我不多讲了,更多了解请直接参考http://www.opensymphony.com/compass。
很多看了Compass的人多少对Compass的配置文件都有点云里雾里的感觉(我最开始也如此:P)。由于Compass有很多地方都借鉴了Hibernate的思想,在此我结合Hibernate中的思想来帮助我们对Compass的配置文件进行理解。
Hibernate是一个O/R Mapping工具,它可以将实体对象和数据库中的表进行映射。最终通过访问实体对象来达到访问数据库的目的。
Compass是一个搜索引擎框架,它可以将common meta data与实体对象进行映射。最终通过访问common meta data来达到访问对象的目的。
综上所述,Hibernate是对象到数据库。而Compass是common meta data 到对象。
Compass的配置文件主要分成三类:
第一类:*.cmd.xml文件
*.cmd.xml文件是对common meta data进行定义,我们就可以把它是当作Hibernate中的POJO来理解。里面定义了最终搜索的结果中的最基本的元数据。下面是一个*.cmd.xml文件的片断:
<compass-core-meta-data>
<meta-data-group id="petclinic" displayName="Petclinic Meta Data">
<descrīption>Petclinic Meta Data</descrīption>
<uri>http://compass/sample/petclinic</uri>
<alias id="vet" displayName="Vet">
<descrīption>Vet alias</descrīption>
<uri>http://compass/sample/petclinic/alias/vet</uri>
<name>vet</name>
</alias>
…………
<meta-data id="petType" displayName="Pet Type">
<descrīption>The type of a pet</descrīption>
<uri>http://compass/sample/petclinic/petType</uri>
<name>petType</name>
</meta-data>
</meta-data-group>
</compass-core-meta-data>
在这里
<meta-data-group id="petclinic" displayName="Petclinic Meta Data"> 可当作是POJO的package来理解,petclinic可以看成是package name。
<alias id="vet" displayName="Vet"> 可当作是POJO的Class来理解,vet 可以看成是class name。
<meta-data id="petType" displayName="Pet Type">可当作是POJO的property来理解,petType可以看成是property name。
上面xml中所定义的meta data 和alias就是compass需要查询的所有的基本元素组件。
然而common meta data的定义与POJO所不同的是:POJO是用java代码来体现,而common metadata使用xml来体现。POJO的class中定义了property,common metadata中的alias和meta-data是分开定义。
当然上面都是一个类比而已, 其目的是为了便于让我们理解,实际生成的代码并非如上所述的一一对应。compass提供了一个ant task可以将common meta data生成一个class。代码片断如下:
public final class Petclinic {
/**
* Petclinic Meta Data
*/
public static final class Group {
public static final String Id = "petclinic";
public static final String DispayName = "Petclinic Meta Data";
public static final String Uri = "http://compass/sample/petclinic";
}
public static final class Alias {
/**
* Owner alias
*/
public static final class Owner {
public static final String Id = "owner";
public static final String Name = "owner";
public static final String DisplayName = "Owner";
public static final String Uri = "http://compass/sample/petclinic/alias/owner";
public static final String GroupId = "petclinic";
}
}
……
}
第二类:*.cpm.xml文件
*.cpm.xml就是Object/Search Engine Mapping了。我们也可以拿她当作同Hibernate中的*.hbm.xml来理解。他的作用就是提供了POJO到common metadata的映射。下面是一个*.cpm.xml文件的片断:
<compass-core-mapping package="org.compass.sample.petclinic">
<contract alias="entity">
<id name="id" />
</contract>
<contract alias="person" extends="entity">
<property name="firstName">
<meta-data>${petclinic.firstName}</meta-data>
</property>
<property name="lastName">
<meta-data>${petclinic.lastName}</meta-data>
</property>
<property name="address">
<meta-data>${petclinic.address}</meta-data>
</property>
<property name="city">
<meta-data>${petclinic.city}</meta-data>
</property>
<property name="telephone">
<meta-data>${petclinic.telephone}</meta-data>
</property>
</contract>
<class name="Specialty" alias="${petclinic.specialty}" root="false">
<property name="name">
<meta-data>${petclinic.specialty}</meta-data>
</property>
</class>
<class name="Owner" alias="${petclinic.owner}" extends="person">
<property name="firstName">
<meta-data>${petclinic.firstName}</meta-data>
</property>
<property name="lastName">
<meta-data>${petclinic.lastName}</meta-data>
</property>
<property name="address">
<meta-data>${petclinic.address}</meta-data>
</property>
<property name="city">
<meta-data>${petclinic.city}</meta-data>
</property>
<property name="telephone">
<meta-data>${petclinic.telephone}</meta-data>
</property>
<reference name="petsInternal" ref-alias="${petclinic.pet}" />
</class>
</compass-core-mapping>
上面 package对应了POJO的包名,class对应了POJO类名,contract为POJO中一些较为Base类,property对应了POJO的属性。上面看到的像ANT中的${*}就是*.cmd.xml 中所定义的common metadata。通常来说*.cmd.xml中的alias同POJO的Class进行映射。Meta data同Class中的property进行映射。更多的映射的细节在此不多讲。可以参考 Compass的中自带的Sample Petclinic来理解。
第三类:*.cfg.xml文件
Compass的*.cfg.xml文件就和Hibernate的*.cfg.xml有些类似了。下面是一个*.cfg.xml文件的内容:
<compass-core-configuration>
<compass>
<setting name="compass.engine.connection">target/index</setting>
<meta-data resource="org/compass/sample/library/library.cmd.xml" />
<mappings>
<class name="test.Author" />
</mappings>
</compass>
</compass-core-configuration>
上面
<setting name="compass.engine.connection">target/index</setting> 指定了索引文件存放的路径。
<meta-data resource="org/compass/sample/library/library.cmd.xml" /> 指定了*.cmd.xml文件存放的路径。
<mappings><class name="test.Author" /></mappings>是对compass的mapping文件进行指定。Test.Author对应的文件是test/Author.cpm.xml.
<compass>是对compass中的compass类进行的一些参数设置,这个compass是一个重量级的类,类似于Hibernate中SessionFactory.
当Hibernate同Spring进行整合后,Hibernate就不需要*.cfg.xml这个文件了,借而代之的是用Spring的配置文件来进行配置。同样,Compass同Spring进行整合后,*.cfg.xml也可以不需要了。比如如下的Spring配置。
<!-- COMPASS START -->
<bean id="compass" class="org.compass.spring.LocalCompassBean">
<property name="resourceLocations">
<list>
<value>classpath:org/compass/sample/petclinic/petclinic.cmd.xml</value>
<value>classpath:petclinic.cpm.xml</value>
</list>
</property>
<property name="compassSettings">
<props>
<prop key="compass.engine.connection">file://${user.home}/compass/petclinic</prop>
<prop key="compass.transaction.factory">org.compass.spring.transaction.SpringSyncTransactionFactory</prop>
</props>
</property>
<property name="transactionManager">
<ref local="transactionManager" />
</property>
</bean>
<bean id="hibernateGpsDevice" class="org.compass.spring.device.hibernate.SpringHibernate3GpsDevice">
<property name="name"><value>hibernateDevice</value></property>
<property name="sessionFactory"><ref local="sessionFactory" /></property>
</bean>
<bean id="compassGps" class="org.compass.gps.impl.SingleCompassGps" init-method="start" destroy-method="stop">
<property name="compass"><ref bean="compass" /></property>
<property name="gpsDevices">
<list>
<ref local="hibernateGpsDevice" />
</list>
</property>
</bean>
<!-- COMPASS END -->
在上诉的配置文件中又引出了两个新的知识点,CompassGps和CompassGpsDevice。
CompassGps像是一个Service,他需要在application startup时启动服务,application shutdown停止服务,CompassGpsDevice不能独立的存在,他需要依赖CompassGps,CompassGps为CompassGpsDevice提供Compass对象,他们一起为程序提供Index的实时更新。 Compass整合Hibernate 等等 persitanceframework的代码就在CompassGpsDevice里,你需要提供不同的Device,如HibernateDevice,JDODevice。你也可以实现自己的Device, CompassGpsDevice会把domainobject的更新事件通过CompassGps去通知Compass去实时更新索引文件。
- compass 的一些理解 ,转载http://zhangljerry.javaeye.com/blog/112580
- automation服务器不能创建对象”的问题的解决方案总结大全(转载于javasee【http://bigtree2006.javaeye.com/blog/321383】)
- [转载]C++中头文件相互包含的几点问题 http://waret.javaeye.com/blog/729349
- http://heweiya.javaeye.com/blog/101575
- http://zangweiren.javaeye.com/blog/208122
- http://coolszy.javaeye.com/blog/563795
- http://devilhand.javaeye.com/blog/560596
- http://sqcwfiu.javaeye.com/blog/555137
- http://wangzhen5.javaeye.com/blog/780178
- http://11lingxian.javaeye.com/blog/675306
- http://skydream.javaeye.com/blog/585157
- http://bdk82924.javaeye.com/blog/564353
- http://lapulande.javaeye.com/blog/847961
- http://wxb-j2ee.javaeye.com/blog/797958
- 转载 (http://myclover.javaeye.com/blog/352558) IntelliJ IDEA快捷键
- Linux文件权限[转载自:http://dengyin2000.javaeye.com/blog/444175]
- map,set,list,等JAVA中集合解析【转载 http://zhaosoft.javaeye.com/blog/243586】
- spring 任务调度 Quartz 表达式(转载http://sunxboy.javaeye.com/blog/234553)
- ogre1.7中文路径bug处理
- asp.net控件开发(二)-简单属
- 最通用的分页存储过程
- 感慨
- asp.net控件开发(三):处理标签间内容
- compass 的一些理解 ,转载http://zhangljerry.javaeye.com/blog/112580
- 你猜!
- window.event兼容firefox
- BB Mobile
- 图论与算法:名师风采
- Apache2 httpd.conf 中文版
- 关于SQL的左右连接查询
- 简单介绍一下jQuery的一些特性和用法:
- 集合已修改,枚举操作可能无法执行