欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Compass将lucene、Spring、Hibernate三者结合

程序员文章站 2022-07-15 16:36:17
...
版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明http://wemyss.blogbus.com/logs/8014799.html
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.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://${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如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的做法,完全自行扩展。





搜索引擎和网络爬虫群293961767 欢迎志同道合的朋友加入!