`
- 浏览:
833934 次
-
Compass将lucene、Spring、Hibernate三者结合
- 1.概述
- Compass将lucene、Spring、Hibernate三者的起来,以很低很低的成本快速实现企业应用中的搜索功能。
-
HomePage: http:
- 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.java
-
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; }
-
-
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:
-
<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如Book
- compass.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="http://www.zhmy.com/${searchResults.searchTime}"/>ms
-
<c:forEach var="hit" items="${searchResults.hits}">
- <c:choose>
-
<c:when test="${hit.alias == 'book'}">
-
<div class="left_content">
-
<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的做法,完全自行扩展。
-
-
- 其实compass只是简单的应用的话,也很容易上手的
- 假如使用了hibernate+spring+compass
- 关于compass在spring中的配置如下,保存为一个xml文件,在web.xml中引入即可
- Java代码
-
<?xml version="1.0" encoding="UTF-8"?>
-
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
- <beans>
-
<bean id="annotationConfiguration" class="org.compass.annotations.config.CompassAnnotationsConfiguration"></bean>
-
-
<bean id="compass" class="org.compass.spring.LocalCompassBean">
- <!-- 这里的配置意思是指需要搜索的POJO对象 -->
-
<property name="classMappings">
- <list>
- <value>com.tourye.model.TnInfomation</value>
- </list>
- </property>
- <!-- 这里的配置意思是指使用annotation进行compass配置 -->
-
<property name="compassConfiguration" ref="annotationConfiguration" />
-
<property name="compassSettings">
- <props>
-
<prop key="compass.engine.connection">/home/dev/compass</prop>这里说明索引文件所放的目录
-
<prop key="compass.transaction.factory">org.compass.spring.transaction.SpringSyncTransactionFactory</prop>
-
<!-- <prop key="compass.engine.analyzer.default.type">net.paoding.analysis.analyzer.PaodingAnalyzer</prop> -->这里的注释是为了说明使用paoding的分词器,由于测试时,有时会出问题,所以暂时禁用
- </props>
- </property>
-
<property name="transactionManager">
-
<ref bean="transactionManager" />
- </property>
- <!--
-
高亮设置,未测试成功,需要相关的代码辅助 <property name="compass.engine.highlighter.default.formatter.simple.pre"> <value><![CDATA[<font
-
color="red"><b>]]></value> </property> <property name="compass.engine.highlighter.default.formatter.simple.post">
- <value><![CDATA[</b></font>]]></value> </property>
- -->
- </bean>
- 下面的两段配置是为了说明compass构建索引与hibernate的insert/delete/update操作同步
-
<bean id="hibernateGpsDevice" class="org.compass.gps.device.hibernate.HibernateGpsDevice">
-
<property name="name">
- <value>hibernateDevice</value>
- </property>
-
<property name="sessionFactory">
-
<ref bean="mySessionFactory" />
- </property>
-
<property name="nativeExtractor">
-
<bean class="org.compass.spring.device.hibernate.SpringNativeHibernateExtractor" />
- </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>
-
<bean class="org.compass.spring.device.SpringSyncTransactionGpsDeviceWrapper">
-
<property name="gpsDevice" ref="hibernateGpsDevice" />
- </bean>
- </list>
- </property>
- </bean>
-
- <!-- 自动随Spring ApplicationContext启动而重建索引,未研究 -->
-
<bean id="compassIndexBuilder" class="com.tourye.service.timer.CompassIndexBuilder" lazy-init="false">
-
<property name="compassGps" ref="compassGps" />
-
<property name="buildIndex" value="true" />
-
<property name="lazyTime" value="10" />
- </bean>
- </beans>
-
- 第二步:
- 使用annotatio声明要索引的object,如下所示,自己根据需要进行设置
- Java代码
-
@Searchable
-
public class TnInfomation implements java.io.Serializable {
-
private static final long serialVersionUID = -4503017770118428686L;
-
-
@SearchableId(name = "id")
-
private Long id;
-
-
private int type;
-
@SearchableProperty(name="title")
-
private String title;
-
@SearchableProperty(name="keywords")
-
private String keywords;
-
@SearchableProperty(name="content")
-
private String content;
-
private int author;
-
private Date createtime;
-
private Date updatetime;
-
@SearchableProperty(name="approvetime")
-
private Date approvetime;
-
private int clicks;
-
private int critiques;
-
private String provenance;
-
@SearchableProperty(name="status")
-
private byte status;
-
- 第三步,建立搜索service
- Java代码
-
public class InfomationSearchServiceImpl implements InfomationSearchService {
-
private Compass compass;
-
-
public Compass getCompass() {
-
return compass;
- }
-
-
public void setCompass(Compass compass) {
-
this.compass = compass;
- }
-
-
-
-
-
-
-
-
-
public CompassSearchResults search(String query, int page, int pageSize) throws Exception {
- CompassSession session = compass.openSession();
-
try {
- session.beginTransaction();
-
- CompassQueryBuilder querybuilder = session.queryBuilder();
-
CompassQuery cq = null;
-
CompassSearchCommand csc = null;
-
-
if (StringUtils.isNotEmpty(query)) {
-
cq = querybuilder.bool().addMust(querybuilder.spanEq("status", 1)).addMust(
- querybuilder.queryString(query).toQuery()).toQuery();
-
cq.addSort("approvetime", CompassQuery.SortDirection.REVERSE);
-
csc = new CompassSearchCommand(cq, new Integer(Math.max(0, page - 1)));
-
} else {
-
csc = new CompassSearchCommand(query.trim());
- }
-
-
InfomationSearchHelper searchHelper = new InfomationSearchHelper(compass, pageSize);
- CompassSearchResults searchResults = searchHelper.search(csc);
-
-
return searchResults;
-
} finally {
-
if (session != null) session.close();
- }
- }
- }
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
Compass将lucene、Spring、Hibernate三者的起来,以很低很低的成本快速实现企业应用中的搜索功能。 ... 下面是compass在spring中的简明配
spring+hibernate+jpa+struts1+struts2+springmvc+jquery+freemaker 学习笔记 Compass将lucene、Spring、Hibernate三者结合
java struts spring hibernate COMPASS+lucene搜索引索
Struts+Hibernate+spring+jpa+lucene+jbpm+compass配置文件
struts2 + spring2.5 + hibernate 3.2 + lucene 2.4 + compass 2.0 包含所有jar包,按readme.txt导入并运行即可 开始不用分了................
使用compass+lucene实现简单的全文检索功能 里面整合了spring2.5、hibernate3.2、struts2.0,是对数据库进行全文检索的一个非常好的demo的所有jar包组合! 对研究基于数据库检索的java开源搜索引擎的朋友有很大的...
学生时期做的电子商务系统,主要用到的技术有Struts2,Hibernate,Spring2,Lucene,Compass,FreeMarker,OsCache缓存技术,数据库用的是Mysql,要去修改conf下面的配置文件
struts2-spring-compass Struts2整合Spring3、Hibernate、Compass实现全文检索(基于lucene2.4.1和极易中文分词器)
Built on top of the amazing Lucene Search Engine, Compass integrates seamlessly to popular development frameworks like Hibernate and Spring. Compass is a powerful, transactional Object to Search ...
自己用Lucene写的贴吧,因为用的是Lucene3.0,Compass不支持,所以没用Compass,整合了S2SH(Struts2+Spring2.5+Hibernate3.6)
本资源是struts2 + spring2.5 + hibernate 3.2 + lucene 2.4 + compass 2.0整合实例,可以为初学入门者,提供个参考,本人也是网上找的,感觉很不错(因其中所用的jar文件太大,无法上传,大家可以自己添加各框架...
Compass 框架以声明方式为您的应用程序堆栈启用了搜索引擎语义的强大功能。 Compass 建立在令人惊叹的 Lucene 搜索引擎之上,无缝集成到流行的开发框架,如 Hibernate 和 Spring。
J.Office是基于J2EE,Spring,Struts2,EXT3,Hibernate,Compass,Lucene,Jasper Report,Jbpm4.4优秀技术整合,支持windows、Linux、Unix**台运行。数据库支持Oracle、Sql server、Mysql、 DB2等多种数据库,文档支持全文...
lucene-core.jar 、lucene-highlighter.jar 、compass-index-patch.jar、 compass-2.1.0.jar 是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎 json-lib-2.2.3-jdk15.jar json和java转化的辅助工具 ...
lucene-core.jar 、lucene-highlighter.jar 、compass-index-patch.jar、 compass-2.1.0.jar 是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎 json-lib-2.2.3-jdk15.jar json和java转化的辅助工具 ...
同时一个mail note将被发送给消息发送者,发送一个e-mail通知给由recipient参数确定的e-mail账号,查询mail 服务器的会话…… 还包括消息客户端程序,通过连接创建会话。创建发送者和映射消息。发送消息,同时对...
同时一个mail note将被发送给消息发送者,发送一个e-mail通知给由recipient参数确定的e-mail账号,查询mail 服务器的会话…… 还包括消息客户端程序,通过连接创建会话。创建发送者和映射消息。发送消息,同时对...
Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...
Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...