`

使用Compass实现搜索功能

 
阅读更多
1前言

Compass 是一个功能强大、支持事务的JAVA搜索引擎框架。Compass允许将对象域模型映射到搜索引擎,并能同步搜索引擎索引和数据源。Compass 在低级别的 Lucene API的基础上提供了更高级别的抽象。同时Compass实现了快速索引操作和优化,并使搜索引擎具有事务处理能力。

本文档介绍在SSH(struts+spring+hibernate)环境下配置和使用Compass的方法。
2 下载compass包

创建JAVA web工程,并导入struts、spring、hibernate所需的JAR文件及配置文件。

从官方网站http://www.compass-project.org下载Compass软件包:compass-2.2.0-with-dependencies.zip。解开压缩文件后,将compass-2.2.0.jar和lucene-core-2.4.1.jar添加到项目的Build Path中。
3 OSEM - Object/Search Engine Mapping

Compass 通过使用Java 5 注解或者简单的XML映射文件将Java对象映射到搜索引擎。

这种技术就是OSEM (Object Search Engine Mapping)。Compass 使用OSEM从对象中抽取需要的属性,并将需要的元数据插入到搜索引擎索引中。本文采用XML文件来描述对象和搜索引擎的关系。

1.   域模型的POJO

下面是一个Java POLO类。
public class Book implements java.io.Serializable {

    // Fields

    private long bookId;

    private String bookName;

    private String isbn;

    private String publisher;

    private String author;

    private long currentStock;

    private long safeStock;

    private Double price;

    private String memo;

    // 方法略

}


2.   OSEM XML映射定义

Book.cpm.xml文件的内容:
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE compass-core-mapping PUBLIC

    "-//Compass/Compass Core Mapping DTD 2.2//EN"    "http://www.compass-project.org/dtd/compass-core-mapping-2.2.dtd">

<compass-core-mapping package="cn.ittrain.tcrm.domain">

<class name="Book" alias="${mybooks.book}">

   <id name="bookId" />

   <property name="bookName">

    <meta-data>${mybooks.bookName}</meta-data>

   </property>

   <property name="isbn">

    <meta-data>${mybooks.isbn}</meta-data>

   </property>

   <property name="publisher">

    <meta-data>${mybooks.publisher}</meta-data>

   </property>

   <property name="author">

    <meta-data>${mybooks.author}</meta-data>

   </property>

   <property name="currentStock">

    <meta-data>${mybooks.currentStock}</meta-data>

   </property>

   <property name="safeStock">

    <meta-data>${mybooks.safeStock}</meta-data>

   </property>

   <property name="price">

    <meta-data>${mybooks.price}</meta-data>

   </property>

   <property name="memo">

    <meta-data>${mybooks.memo}</meta-data>

   </property>

</class>

</compass-core-mapping>

其中的元数据名和别名在下面的元数据文件中定义,Compass会自动用元数据名和别名的值来替换${}。

3.   元数据(Meta data)定义

公共元数据文件定义在OSEM映射文件中使用的元数据名和别名。

每一个类的映射定义都在一个别名下注册。别名是类的OSEM定义和类本身之间的桥梁。可以使用别名来引用一个类的映射定义。

元数据把映射定义中属性的值按照名称保存到索引中。

Book.cmd.xml文件的内容:
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE compass-core-meta-data PUBLIC

    "-//Compass/Compass Core Meta Data DTD 2.2//EN"

    "http://www.compass-project.org/dtd/compass-core-meta-data-2.2.dtd">

<compass-core-meta-data>

<meta-data-group id="mybooks" displayName="Mybooks Meta Data">

   <description>Book Meta Data</description>

   <uri>http://compass/mybooks</uri>

   <alias id="book" displayName="Book">

    <description>Book alias</description>

    <uri>http://compass/mybooks/Book</uri>

    <name>book</name>

   </alias>  

   <meta-data id="bookId" displayName="BookId">

    <description>BookId alias</description>

    <uri>http://compass/mybooks/bookId</uri>

    <name>bookId</name>

   </meta-data>

   <meta-data id="bookName" displayName="BookName">

    <description>BookName alias</description>

    <uri>http://compass/mybooks/bookName</uri>

    <name>bookName</name>

   </meta-data>

   <meta-data id="isbn" displayName="isbn">

    <description>isbn alias</description>

    <uri>http://compass/mybooks/isbn</uri>

    <name>isbn</name>

   </meta-data>

    <meta-data id="publisher" displayName="Publisher">

    <description>Publisher alias</description>

    <uri>http://compass/mybooks/publisher</uri>

    <name>publisher</name>

   </meta-data>

   <meta-data id="author" displayName="Author">

    <description>Author alias</description>

    <uri>http://compass/mybooks/author</uri>

    <name>author</name>

   </meta-data>

   <meta-data id="currentStock" displayName="CurrentStock">

    <description>CurrentStock alias</description>

    <uri>http://compass/mybooks/currentStock</uri>

    <name>currentStock</name>

   </meta-data>

   <meta-data id="safeStock" displayName="SafeStock">

    <description>SafeStock alias</description>

    <uri>http://compass/mybooks/safeStock</uri>

    <name>safeStock</name>

   </meta-data>

   <meta-data id="price" displayName="Price">

    <description>Price alias</description>

    <uri>http://compass/mybooks/price</uri>

    <name>price</name>

   </meta-data>

   <meta-data id="memo" displayName="Memo">

    <description>Memo alias</description>

    <uri>http://compass/mybooks/memo</uri>

    <name>memo</name>

   </meta-data>

</meta-data-group>

</compass-core-meta-data>


4 Hibernate配置

对3.1节中Book配置Hibernate的映射文件:Book.hbm.xml。
<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

    <class name="cn.ittrain.tcrm.domain.Book" table="BOOK" schema="LIXIANZHU">

        <id name="bookId" type="long">

            <column name="BOOK_ID" precision="22" scale="0" />

            <generator class="sequence" />

        </id>

        <property name="bookName" type="java.lang.String">

            <column name="BOOK_NAME" length="50" />

        </property>

        <property name="isbn" type="java.lang.String">

            <column name="ISBN" length="20" />

        </property>

        <property name="publisher" type="java.lang.String">

            <column name="PUBLISHER" length="50" />

        </property>

        <property name="author" type="java.lang.String">

            <column name="AUTHOR" length="20" />

        </property>

        <property name="currentStock" type="long">

            <column name="CURRENT_STOCK" precision="22" scale="0" />

        </property>

        <property name="safeStock" type="long">

            <column name="SAFE_STOCK" precision="22" scale="0" />

        </property>

        <property name="price" type="java.lang.Double">

            <column name="PRICE" precision="126" scale="0" />

        </property>

        <property name="memo" type="java.lang.String">

            <column name="MEMO" />

        </property>      

    </class>

</hibernate-mapping>


5 Spring配置

1.       在配置Compass 相关的bean之前,必须先配置SessionFactory和TransactionManager:
<bean id="sessionFactory"

         class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

         <property name="configLocation"

             value="classpath:hibernate.cfg.xml">

         </property>

</bean> 

<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">

         <property name="sessionFactory" ref="sessionFactory"/>

    </bean>

 


2.   配置Compass。Compass用来实现搜索功能。

<bean id="compass" class="org.compass.spring.LocalCompassBean">

    <property name="resourceLocations">

         <list>

             <value>classpath:Book.cmd.xml</value>

             <value>classpath:Book.cpm.xml</value>

         </list>

         </property>

    <property name="compassSettings">

         <props>

             <!-- 索引文件在服务器上的存储路径 -->

             <prop key="compass.engine.connection">target/index</prop>

         <prop key="compass.transaction.factory">org.compass.spring.transaction.SpringSyncTransactionFactory</prop>

             </props>

         </property>

         <property name="transactionManager" ref="txManager"/>

    </bean> 



3.   配置CompassGps。CompassGps用来实现索引功能。
 <!-- 与hibernate的绑定,用Hibernate 3 事件系统,支持Real Time Data Mirroring .

    经Hiberante的数据改变会自动被反射到索引里面.  -->

<bean id="hibernateGpsDevice" class="org.compass.spring.device.hibernate.dep.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>


4.   配置CompassSearchCommand和CompassSearchHelper。CompassSearchCommand存储搜索命令,CompassSearchHelper执行搜索查询。

<bean id="compassSearchCommand" class="org.compass.core.support.search.CompassSearchCommand"/>

   

<bean id="compassSearchHelper" class="org.compass.core.support.search.CompassSearchHelper">

         <constructor-arg value="2" /> <!-- 每页的条数 -->

         <constructor-arg ref="compass" />

</bean>


6 配置Action

SearchAction用来建立索引和搜索。indexControl方法建立索引,而searchControl方法执行搜索。SearchAction以及compassGps、compassSearchCommand、compassSearchHelper由Spring依赖注入,其在Spring配置文件中的声明不在此赘述。

public class SearchAction extends DispatchAction {

    private static final Log log = LogFactory.getLog(SearchAction.class);

    private CompassGps compassGps;

    private CompassSearchCommand compassSearchCommand;  

    private CompassSearchHelper compassSearchHelper;

    // Setter 方法略

 

    public ActionForward indexControl(ActionMapping mapping, ActionForm form,

             HttpServletRequest request, HttpServletResponse response) {

         compassGps.start();

         compassGps.index();

         return null;

    }

   

    public ActionForward searchControl(ActionMapping mapping, ActionForm form,

             HttpServletRequest request, HttpServletResponse response) {

         String query = request.getParameter("query");       

         String page = request.getParameter("page");

         Integer pageFrom = (page == null || page.length() == 0) ? 0:Integer.valueOf(page);

         compassSearchCommand.setQuery(query);

         compassSearchCommand.setPage(pageFrom);

         CompassSearchResults searchResults

= compassSearchHelper.search(compassSearchCommand);

         String commandQuery = compassSearchCommand.getQuery();

         request.setAttribute("status", commandQuery);

         request.setAttribute("searchResults", searchResults);

         return mapping.findForward("searchResults");

    }

}


7 搜索页面
<body>

  <FORM method="GET" action="search.do">

    <INPUT type="text" size="20" name="query" value="<c:out value="${status}"/>" />

    <input type="hidden" name="method" value="searchControl"/>

   <INPUT type = "submit" value="Search"/>

  </FORM> 

<c:if test="${! empty searchResults}"> 

  搜索花费 <c:out value="${searchResults.searchTime}" />毫秒

  搜索关键字:<c:out value="${status}"/>

  <c:forEach var="hit" items="${searchResults.hits}">

   <c:choose>

     <c:when test="${hit.alias == 'book'}">

       <P>

         BookId:<a href="<c:url value="/editPet.htm?petId=${hit.data.bookId}"/>">

           ${hit.data.bookId}

         </a>

         BookName:<c:out value="${hit.data.bookName}" />

         Publisher:<c:out value="${hit.data.publisher}" />

         ISBN:<c:out value="${hit.data.isbn}" />

        <br/>       

     </c:when>

   </c:choose>

  </c:forEach>

 

  <c:if test="${! empty searchResults.pages}">

    <BR><BR><BR>

    <table><tr>

    <c:forEach var="page" items="${searchResults.pages}" varStatus="pagesStatus">

      <td>

      <c:choose>

        <c:when test="${page.selected}">

          <c:out value="${page.from}" />-<c:out value="${page.to}" />

        </c:when>

        <c:otherwise>

         <FORM method="GET" action="search.do">          

    <INPUT type="hidden" name="query" value="<c:out value="${status}"/>" />

    <INPUT type="hidden" name="page" value="<c:out value="${pagesStatus.index}"/>" />          

         <input type="hidden" name="method" value="searchControl"/>

           <INPUT type = "submit" value="<c:out value="${page.from}" />-<c:out value="${page.to}" />"/>

          </FORM>

        </c:otherwise>

      </c:choose>

      </td>

    </c:forEach>

    </tr></table>

  </c:if>

</c:if>

  </body>
分享到:
评论

相关推荐

    struts2+spring2.5+hibernate3.26+compass2.1搜索引擎简单实现(无jar包)

    为了实现搜索功能,你需要创建一个搜索Action,该Action可以调用由Spring管理的Service,Service再通过CompassTemplate执行查询。你可以使用Compass提供的Gps接口或者自定义查询语句来实现对索引的检索。检索结果...

    使用compass+lucene实现简单的全文检索功能

    它们可以帮助开发者构建高效、强大的文本搜索功能。本文将详细介绍如何使用 Compass 和 Lucene 实现一个简单的全文检索功能。 首先,Lucene 是一个高性能、全功能的文本分析库,主要用于信息检索。它提供了索引和...

    ssh+compass实现站内搜索分页.rar

    通过以上步骤,你可以在SSH框架下成功集成Compass实现站内搜索分页。这一过程涉及到Java Web开发的多个层面,包括MVC架构、数据库操作、全文检索以及用户体验设计。熟练掌握这些技能将有助于构建高效且功能丰富的Web...

    compass对象搜索引擎

    综上所述,Compass对象搜索引擎通过提供面向对象的接口和强大的元数据映射,简化了Java开发者在应用中集成全文检索的复杂性,让搜索功能的实现变得更为高效和便捷。结合Lucene的优秀性能,Compass成为了一个强大的...

    compass搜索引擎技术

    Compass搜索引擎技术是一种基于Lucene的全文检索框架,它提供了更高级别的API和集成机制,使得在Java应用程序中实现搜索引擎功能变得更加便捷。Compass的主要目标是将全文索引能力无缝地融入到现有的业务应用程序中...

    Spring ,JPA,Compass使用注解开发的博客站内搜索

    接下来,为了实现搜索功能,我们需要创建一个Service层的接口和实现类,这个类会调用Compass的API来执行搜索查询。搜索方法可能接受关键词参数,然后使用Compass的QueryBuilder或直接写入Lucene的Query语法来构建...

    基于Lucene的搜索引擎框架Compass教程

    Lucene提供了底层的搜索功能,而Compass是对Lucene的高级封装,它在Lucene的基础上添加了更多便利的功能,如ORM集成、事务支持等。对于开发者来说,使用Compass可以更快地上手,减少对Lucene底层细节的了解,提高...

    java搜索 compass资料

    - **安全性**:可以结合权限控制等机制实现安全的搜索功能。 总之,Compass 是一个强大的全文检索框架,它不仅可以满足基本的搜索需求,还能支持复杂的数据管理和检索任务。通过合理配置和优化,可以充分发挥其潜力...

    S2SH+compass (实现站内全文检索)

    4. 实现搜索功能:在Struts2的动作类中,调用Compass的查询API,根据用户输入的关键词执行搜索,并将结果返回到视图层展示。 5. 整合优化:优化搜索性能,比如使用缓存机制,或者通过调整Compass和Lucene的配置参数...

    compass_使用详解.pdf compass_教程 compass_试用案例

    ### Compass 使用详解 ...通过上述步骤,开发者可以轻松地将 Java 实体映射到 Lucene 索引中,实现高效的数据检索功能。对于需要处理大量结构化数据的应用来说,Compass 是一个非常值得考虑的选择。

    Compass 的java代码

    **Compass:Lucene的高级封装...记住,Compass的主要目标是简化Lucene的使用,让开发者更专注于业务逻辑,而不是底层的搜索引擎实现。因此,无论你是构建一个小型项目还是大型企业应用,Compass都能成为你的得力助手。

    SSH2整合compass做搜索引挚

    5. 实现搜索功能:在Struts2的动作类中,调用Compass提供的API进行搜索,并将结果返回到视图层展示。 6. 错误处理和优化:测试和调试搜索功能,处理可能出现的问题,如索引丢失、搜索性能低下等。 通过上述整合,...

    compass完整可用项目

    Compass提供了一种简单的方式来在Java应用程序中集成全文搜索功能,使得开发者可以方便地在数据库、文件系统等存储中的对象上进行高效的全文检索。 Lucene是Apache软件基金会的开源项目,它是一个高性能、全文本...

    compass+lucene

    Compass的核心目标是简化与数据库交互时的搜索功能,通过透明地创建、管理和优化索引来实现。它的主要特点包括: 1. **透明性**:Compass能够在运行时自动检测和索引应用程序中的对象,无需手动编写索引代码。 2. *...

    Compass原理深入学习笔记

    【Compass原理深入学习笔记】 Compass是一款基于Apache Lucene的全文搜索引擎框架,它为...通过Compass,可以实现类似Hibernate对数据库的操作体验,但针对搜索引擎进行数据管理,提高了大规模文本数据的检索效率。

    基于Luncene的compass框架详解-java

    通过以上步骤,我们可以在SSH架构的项目中无缝集成Compass框架,实现高效的全文搜索功能,提升应用程序的数据检索能力和用户体验。 总结而言,Compass框架通过其丰富的特性,如事物管理和快速更新优化,以及对...

    Compass+SSH搜索引擎简单项目

    搜索功能可能是通过Struts2的Action类实现,接收用户的查询参数,调用业务层服务,利用Compass的API执行搜索,并将结果返回到视图层展示。 项目中的`Compass_lib.rar`可能包含了Compass库和其他相关的依赖,确保...

Global site tag (gtag.js) - Google Analytics