利用Compass实现一个简单的搜索引擎[转]

Compass是一流的开放源码JAVA搜索引擎框架,对于你的应用修饰,搜索引擎语义更具有能力。依靠顶级的 Lucene搜索引擎,Compass 结合了,像 Hibernate和 Sprin的流行的框架,为你的应用提供了从数据模型和数据源同步改变的搜索力.并且添加了2方面的特征,事物管理和快速更新优化. Compass的目标是:把java应用简单集成到搜索引擎中.编码更少,查找数据更便捷。
    下面以一个应用场景分步骤讲解如何利用compass实现搜索引擎:
1. 这里我们有一个Article表,希望利用compass实现对它的搜索。
  Article的结构如下:
  CREATE TABLE `article` (
    `ArticleID` bigint(20) NOT NULL,
    `PersonInfoID` bigint(20) default NULL,
    `ArticleTitle` varchar(200) default NULL,
    `PublishDate` datetime default NULL,
    `Summary` text,
    `Content` longtext,
    `KeyList` text,
    PRIMARY KEY  (`ArticleID`),
    KEY `PersonInfoArticle_FK` (`PersonInfoID`)
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  我们希望利用compass对它的ArticleTitle、Summary、Content和KeyList进行全文检索。下面开始行动吧。
  
2. 首先到 http://www.opensymphony.com/compass/download.action 上下载一个compass的发布版,我们下载的是Version 1.0.0的With Dependencies 。这样就可能省去寻找相关信赖库的麻烦了。

3. 将compass1.0解压到一个合适的目录,我们的工作目录是d:\develop\compass1.0

4. 我们是在eclipse环境下实现当前要求的,所以建议你也安装一个eclipse 3.2。

5. 首先我们在eclipse中建立了一个java工程,名为mycompass。

6. 然后我们在工程目录中建立了一个lib目录,用来存放本次工程所需要的所有compass和其它相关的库文件,并将他们设置为当前工程构建路径中需要的库文件。所有这些文件可以在compass的安装目录的lib目录找到。

  下面是我们的库文件列表:
 
7. 建立了Article表的pojo类。
  package com.darkhe.sample.mycompass;
  
  // Generated 2006-8-2 10:57:06 by Hibernate Tools 3.2.0.beta6a
  
  import java.util.Date;
  
  /**
   * Article generated by hbm2java
   */
  public class Article implements java.io.Serializable {
  
   // Fields   
  
   private long articleId;
  
   private Long personInfoId;
  
   private String articleTitle;
  
   private Date publishDate;
  
   private String summary;
  
   private String content;
  
   private String keyList;
  
   // Constructors
  
   /** default constructor */
   public Article() {
   }
  
   /** minimal constructor */
   public Article(long articleId) {
    this.articleId = articleId;
   }
  
   /** full constructor */
   public Article(long articleId, Long personInfoId, String articleTitle,
     Date publishDate, String summary, String content, String keyList) {
    this.articleId = articleId;
    this.personInfoId = personInfoId;
    this.articleTitle = articleTitle;
    this.publishDate = publishDate;
    this.summary = summary;
    this.content = content;
    this.keyList = keyList;
   }
  
   // Property accessors
   public long getArticleId() {
    return this.articleId;
   }
  
   public void setArticleId(long articleId) {
    this.articleId = articleId;
   }
  
   public Long getPersonInfoId() {
    return this.personInfoId;
   }
  
   public void setPersonInfoId(Long personInfoId) {
    this.personInfoId = personInfoId;
   }
  
   public String getArticleTitle() {
    return this.articleTitle;
   }
  
   public void setArticleTitle(String articleTitle) {
    this.articleTitle = articleTitle;
   }
  
   public Date getPublishDate() {
    return this.publishDate;
   }
  
   public void setPublishDate(Date publishDate) {
    this.publishDate = publishDate;
   }
  
   public String getSummary() {
    return this.summary;
   }
  
   public void setSummary(String summary) {
    this.summary = summary;
   }
  
   public String getContent() {
    return this.content;
   }
  
   public void setContent(String content) {
    this.content = content;
   }
  
   public String getKeyList() {
    return this.keyList;
   }
  
   public void setKeyList(String keyList) {
    this.keyList = keyList;
   }
  
  }


8. 建立hibernate的pojo到数据表映射文件
 

xml 代码

  1. <?xml version="1.0"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  3.    
  4.  <hibernate-mapping>  
  5.     <class name="com.darkhe.sample.mycompass.Article" table="article" catalog="freedom">  
  6.         <id name="articleId" type="long">  
  7.             <column name="ArticleID" />  
  8.             <generator class="assigned" />  
  9.         </id>  
  10.         <property name="personInfoId" type="java.lang.Long">  
  11.             <column name="PersonInfoID"/> 
  12.         </property>  
  13.         <property name="articleTitle" type="string">  
  14.             <column name="ArticleTitle" length="200"/>   
  15.         </property>  
  16.         <property name="publishDate" type="timestamp">  
  17.             <column name="PublishDate" length="19"/>
  18.         </property>  
  19.         <property name="summary" type="string">  
  20.             <column name="Summary" length="65535"/> 
  21.         </property>  
  22.         <property name="content" type="string">  
  23.             <column name="Content"/>   
  24.         </property>  
  25.         <property name="keyList" type="string">  
  26.             <column name="KeyList" length="65535"/>  
  27.         </property>  
  28.     </class>  
  29.  </hibernate-mapping>  


  9. 开始配置compass,首先是compass的系统配置文件 mycompass.cfg.xml

xml 代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <compass-core-config  
  3.  xmlns="http://www.opensymphony.com/compass/schema/core-config"  
  4.  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  5.  xsi:schemaLocation="http://www.opensymphony.com/compass/schema/core-config   
  6.            http://www.opensymphony.com/compass/schema/compass-core-config.xsd">  
  7.  <compass name="default">  
  8.    <connection>  
  9.      <file path="target" /> 
  10.    </connection>  
  11.    <searchEngine>         
  12.      <analyzer name="MMAnalyer" type="CustomAnalyzer" analyzerClass="jeasy.analysis.MMAnalyzer">  
  13.        <stopWords>  
  14.          <stopWord value="test" /> 
  15.        </stopWords>
  16.      </analyzer>  
  17.    </searchEngine>  
  18.  </compass>  
  19. </compass-core-config>  

 在上面的配置中,我们使用的我们选用的一个中文分词算法库,你可以用compass自带的。具体compass提供了哪些分词算法,请查阅compass的手册。


10. 然后是mycompass.cmd.xml

xml 代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE compass-core-meta-data PUBLIC "-//Compass/Compass Core Meta Data DTD 1.0//EN" 
  3. "http://www.opensymphony.com/compass/dtd/compass-core-meta-data.dtd">  
  4. <compass-core-meta-data>  
  5.   <meta-data-group id="mycompass" displayName="My Compass">       
  6.     <descrīption>Mycompass Meta Data</descrīption>          
  7.     <uri>http://com/darkhe/sample/mycompass</uri>               
  8.            
  9.     <alias id="Article" displayName="Article">  
  10.       <descrīption>Article alias</descrīption>  
  11.       <uri>http://com/darkhe/sample/mycompass/alias/Article</uri>  
  12.       <name>Article</name>  
  13.     </alias>           
  14.             
  15.     <meta-data id="ArticleTitle" displayName="ArticleTitle">  
  16.       <descrīption>ArticleTitle</descrīption>  
  17.       <uri>http://com/darkhe/sample/mycompass/alias/ArticleTitle</uri>  
  18.       <name>ArticleTitle</name>  
  19.     </meta-data>           
  20.     <meta-data id="PublishDate" displayName="PublishDate">  
  21.       <descrīption>PublishDate</descrīption>  
  22.       <uri>http://com/darkhe/sample/mycompass/alias/PublishDate</uri>  
  23.       <name format="yyyy-MM-dd hh:mm:ss">date</name>  
  24.     </meta-data>           
  25.     <meta-data id="Summary" displayName="Summary">  
  26.       <descrīption>Summary</descrīption>  
  27.       <uri>http://com/darkhe/sample/mycompass/alias/Summary</uri>  
  28.       <name>Summary</name>  
  29.     </meta-data>           
  30.     <meta-data id="Content" displayName="Content">  
  31.       <descrīption>Content</descrīption>  
  32.       <uri>http://com/darkhe/sample/mycompass/alias/Content</uri>  
  33.       <name>Content</name>  
  34.     </meta-data>  
  35.     <meta-data id="KeyList" displayName="KeyList">  
  36.       <descrīption>KeyList</descrīption>  
  37.       <uri>http://com/darkhe/sample/mycompass/alias/KeyList</uri>  
  38.       <name>KeyList</name>  
  39.     </meta-data>                                   
  40.   </meta-data-group>       
  41. </compass-core-meta-data>  

11. 再是mycompass.cpm.xml

xml 代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE compass-core-mapping PUBLIC "-//Compass/Compass Core Mapping DTD 1.0//EN" 
  3. "http://www.opensymphony.com/compass/dtd/compass-core-mapping.dtd">  
  4.   
  5. <compass-core-mapping package="com.darkhe.sample.mycompass"> 
  6.   <beans>  
  7.        <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">  
  8.   <property name="location">  
  9.     <value>classpath:jdbc.properties</value>  
  10.   </property>  
  11. </bean>    
  12.    
  13.  <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">  
  14.   <property name="driverClassName">  
  15.    <value>${jdbc.driverClassName}</value>  
  16.   </property>  
  17.   <property name="url">  
  18.    <value>${jdbc.url}</value>  
  19.   </property>  
  20.   <property name="username">  
  21.    <value>${jdbc.username}</value>  
  22.   </property>  
  23.   <property name="password">  
  24.    <value>${jdbc.password}</value>  
  25.   </property>  
  26.  </bean>      
  27.    
  28.  <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
  29.   <property name="dataSource">  
  30.    <ref local="dataSource" />  
  31.   </property>  
  32.   <property name="mappingResources">  
  33.    <list>  
  34.     <value>com/darkhe/sample/mycompass/Article.hbm.xml</value>  
  35.    </list>  
  36.   </property>  
  37.   <property name="hibernateProperties">  
  38.    <props>  
  39.     <prop key="hibernate.dialect">${hibernate.dialect}</prop>  
  40.     <prop key="hibernate.show_sql">false</prop>  
  41.     <prop key="hibernate.generate_statistics">true</prop>  
  42.    </props>  
  43.   </property>  
  44.   <property name="eventListeners">  
  45.    <map>  
  46.     <entry key="merge">  
  47.      <bean class="org.springframework.orm.hibernate3.support.IdTransferringMergeEventListener" />  
  48.     </entry>  
  49.    </map>  
  50.   </property>  
  51.  </bean>     
  52.    
  53.  <bean id="compass" class="org.compass.spring.LocalCompassBean">  
  54.   <property name="resourceLocations">  
  55.    <list>  
  56.     <value>classpath:mycompass.cmd.xml</value>   
  57.     <value>classpath:mycompass.cpm.xml</value>  
  58.    </list>  
  59.   </property>  
  60.   <property name="configLocation">  
  61.    <value>classpath:mycompass.cfg.xml</value>   
  62.   </property>  
  63.     
  64. </beans>  

15. 注意上面的所以配置文件,根据我们上面的配置,都应当放到classpath的根路径。
16. 建立工具类,用来进行spring引擎的初始化工作。

java 代码
  1. /**  
  2.  * 

    @(#) IOC.java 2006-2-1 0:08:23

     
  3.  * 

    Copyright (c) 2005-2006 ???????????????????

     
  4.  */  
  5. package com.darkhe.sample.mycompass;   
  6.   
  7. import org.springframework.context.ApplicationContext;   
  8. import org.springframework.context.support.ClassPathXmlApplicationContext;   
  9.   
  10. /**  
  11.  *   
  12.  *   
  13.  * @version 1.0 2006-2-1  
  14.  * @author darkhe  
  15.  */  
  16. public class IOC {   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值