Blog信息 |
blog名称: 日志总数:1304 评论数量:2242 留言数量:5 访问次数:7593799 建立时间:2006年5月29日 |

| |
[Java Open Source]Compass - QuickStart 软件技术
lhwork 发表于 2007/1/23 8:59:27 |
1.概述
Compass将lucene、Spring、Hibernate三者的起来,以很低很低的成本快速实现企业应用中的搜索功能。
HomePage: http://www.opensymphony.com/compass/
springside里用了compass来做图书搜索,快速建立的流程如下:
1.用简单的compass annotation把Book对象映射到Lucene。
2.配置compass默认提供的基于Spring MVC的Index Controller 和Search Controller。
3.编写查询结果的显示页面,将controller返回的变量显示出来。
2.Object/Search Engine Mapping的 Annotations配置
使用JDK5 的annotation 来进行OSEM(Object/Search Engine Mapping)比用xml文件按简单许多,下面就是简单的搜索类,可见@SearchableID, @SearchableProperty与@SearchableComponent 三个标记,分别代表主键、可搜索的属性与关联的,另一个可搜索的对象,另外Compass要求POJO要有默认构造函数,要实现equals()和hashcode():
详细请点击查看springside中的Product.java , Book.java, Category.javapublic class Product {
@SearchableId
private Integer id;
private Category category;
private String name;
private Double unitprice;
@SearchableProperty(name = "name")
public String getName() {
return this.name;
}
@SearchableComponent (refAlias = "category")
public Category getCategory() {
return this.category;
}
public Double getUnitprice() {
return this.unitprice;
}
3. 与spring,hibernate集成配置
3.1 spring配置文件
hiberante中的sessionFactory,transactionManager相比大家也是轻车熟路了.这里还是带过(因为不牵扯稿费的问题吗^_^ ).compass已经对对spring集成做了很好的封装,让我们的使用更加简单,我们可以不为compass编写一行代码,就可以做完搜索引擎的检索.下面是compass在spring中的简明配置. 详情点击查看springside中的applicationContext-lucene.xml :<beans>
<bean id="annotationConfiguration" class="org.compass.annotations.config.CompassAnnotationsConfiguration"></bean>
<bean id="compass" class="org.compass.spring.LocalCompassBean">
<!-- anontaition式设置 --> <property name="classMappings"> <list> <value>org.springside.bookstore.domain.Book</value> </list> </property> <property name="compassConfiguration" ref="annotationConfiguration"/> <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> <bean id="hibernateGpsDevice" class="org.compass.spring.device.hibernate.SpringHibernate3GpsDevice"> <property name="name"> <value>hibernateDevice</value> </property> <property name="sessionFactory" ref="sessionFactory"/></bean> <bean id="compassGps" class="org.compass.gps.impl.SingleCompassGps" init-method="start" destroy-method="stop">
<property name="compass" ref="compass"/>
<property name="gpsDevices">
<list>
<ref local="hibernateGpsDevice"/>
</list>
</property></bean></beans>
上面要留意的配置有:
annotationConfiguration: 使用annotation配置,指定要转换的POJO如Bookcompass.engine.connection : 索引文件在服务器上的存储路径.hibernateGpsDevice: 与hibernate的绑定,用Hibernate 3 事件系统,支持Real Time Data Mirroring .经Hiberante的数据改变会自动被反射到索引里面.
3.2 web Controller的配置
两个Controller都是现成的,只要配置相关选项即可。
详情请查看springside的bookstore-servlet.xml<bean id="indexBookController" class="org.compass.spring.web.mvc.CompassIndexController"> <property name="compassGps" ref="compassGps"/> <property name= "indexView" value="/admin/indexBook.jsp"/> <property name= "indexResultsView" value="/admin/indexBook.jsp"/> </bean> <bean id="searchBookController" class="org.compass.spring.web.mvc.CompassSearchController"> <property name="compass" ref="compass"/> <propertyname="searchView"value="/home/top.jsp"/> <property name= "searchResultsView" value="/home/searchBook.jsp"/> <property name= "pageSize" value="5"/> </bean>
3.3 View JSP 简单搜索页面:只需要一个query 参数:<INPUT type="text" size="20" name="query">
结果页面:
结果页面将返回几个变量,包括:
searchResults(搜索结果) 包括hits(结果)和 searchtime(耗时) pages(分页信息) 包括page_from page_to等 command(原来的查询请求)
具体使用见springside的advancedSearch.jsp ,下面是简版的代码:<c:if test="${not empty searchResults}">
耗时: <c:out value="${searchResults.searchTime}"/>ms
<c:forEach var="hit" items="${searchResults.hits}">
<c:choose>
<c:when test="${hit.alias == 'book'}">
<div class="left_content">
<p>
<a href="#" class= "title"> 《${hit.data.name}》
</a>
<br/> 作者:
${hit.data.author}
<br/>
</div>
</c:when>
</c:choose>
</c:forEach>
</c:if>
4.扩展高级搜索
扩展高级搜索其实很简单,SpringSide已经初步封装了加入包含以下任意单词,不包含以下任何单词,分类选择等条件及每页显示条数的确定。
如果需要更多条件:
1. 加强搜索页面,加入更多条件的显示。
2. 扩展compass的command class,接受从搜索条件页传过来的条件。 可从springside的AdvancedSearchCommand 扩展或从Compass的原类扩展。
3. 扩展compass的searchController, 将command中的变量重新处理为一个符合Lucene语法规则的query变量 即可(见springside中的AdvancedSearchController ),同时可以为搜索条件页查询图书分类列表一类的变量。
你可以从springside的AdvancedSearchController扩展,重载onSetupCommand (),参考父类的做法,加装自己的条件。重载referenceData(),把图书分类列表这种条件加入到AdvancedSearchCommand 的referenceData Map中供搜索条件页显示,例子见BookSearchController。
也可以参考BookSearchController和AdvancedSearchController的做法,完全自行扩展。
1 Annotations式配置
Compass也提供另一直配置, 使用java5 的annotation 来进行OSEM. 下面就是简单的Plain Old Java Object (POJO)类型的搜索类,使用了Compass annotations.在运行时刻, compass抽取对象属性插入和相应源数据索引中. public class Product {
@SearchableId
private Integer id;
private Category category;
private String name;
private Double unitprice;
@SearchableProperty(name = "name")
public String getName() {
return this.name;
}
@SearchableComponent (refAlias = "category")
public Category getCategory() {
return this.category;
}
public Double getUnitprice() {
return this.unitprice;
}
//other
setter/getter...
注意可被搜索的对象必须遵守下面的规则.
1. 所有的持久化类必须有默认构造函数(没参数的构造函数).2. OSEM要求映射类JavaBean必须有一个或更多的id主建. id属性可以是对象类型,例如java.lang.String or java.util.Date. 并且类注解使用@SearchableClassConverter或者使用定义Converter(通常继承Compass AbstractBasicConverter).3. 使用JavaBean规范, getter/setter.
更多:@Searchable,@SearchableId,@SearchableProperty and So On Look:http://www.opensymphony.com/compass/content/documentation.html
2 XML式配置
OSEM: 对象搜索引擎影影射(Object Search Engine Mapping),通过xml配置文件,提供了POJO's (Plain Old Java Objects)到搜索引擎. 如果采用XML的配置,一般都是 *.cpm.xml 形式 .
1) package指定了对应java类的包名,2)class为pojo类名.contract为公共部分, 子类被可以extends.Property 对 java类的属性。3)资源的Property引用的Search Engine meta-data. 注意: id为类标识. <compass-core-mapping package="org.springside.bookstore.domain"> <contract alias="product">
<id name="id"/>
<property name="name">
<meta-data>${springside.name}</meta-data>
</property>
<property name="descn">
<meta-data>${springside.descn}</meta-data>
</property>
</contract> <class name="Book" alias="${springside.book}" extends="product">
<property name="author">
<meta-data>${springside.author}</meta-data>
</property>
<property name="publisher">
<meta-data>${springside.publisher}</meta-data>
</property>
</class> </compass-core-mapping> |
|
|