下面以一个应用场景分步骤讲解如何利用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 version="1.0"?>
- <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
- <hibernate-mapping>
- <class name="com.darkhe.sample.mycompass.Article" table="article" catalog="freedom">
- <id name="articleId" type="long">
- <column name="ArticleID" />
- <generator class="assigned" />
- </id>
- <property name="personInfoId" type="java.lang.Long">
- <column name="PersonInfoID"/>
- </property>
- <property name="articleTitle" type="string">
- <column name="ArticleTitle" length="200"/>
- </property>
- <property name="publishDate" type="timestamp">
- <column name="PublishDate" length="19"/>
- </property>
- <property name="summary" type="string">
- <column name="Summary" length="65535"/>
- </property>
- <property name="content" type="string">
- <column name="Content"/>
- </property>
- <property name="keyList" type="string">
- <column name="KeyList" length="65535"/>
- </property>
- </class>
- </hibernate-mapping>
9. 开始配置compass,首先是compass的系统配置文件 mycompass.cfg.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <compass-core-config
- xmlns="http://www.opensymphony.com/compass/schema/core-config"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://www.opensymphony.com/compass/schema/core-config
- http://www.opensymphony.com/compass/schema/compass-core-config.xsd">
- <compass name="default">
- <connection>
- <file path="target" />
- </connection>
- <searchEngine>
- <analyzer name="MMAnalyer" type="CustomAnalyzer" analyzerClass="jeasy.analysis.MMAnalyzer">
- <stopWords>
- <stopWord value="test" />
- </stopWords>
- </analyzer>
- </searchEngine>
- </compass>
- </compass-core-config>
在上面的配置中,我们使用的我们选用的一个中文分词算法库,你可以用compass自带的。具体compass提供了哪些分词算法,请查阅compass的手册。
10. 然后是mycompass.cmd.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE compass-core-meta-data PUBLIC "-//Compass/Compass Core Meta Data DTD 1.0//EN"
- "http://www.opensymphony.com/compass/dtd/compass-core-meta-data.dtd">
- <compass-core-meta-data>
- <meta-data-group id="mycompass" displayName="My Compass">
- <descrīption>Mycompass Meta Data</descrīption>
- <uri>http://com/darkhe/sample/mycompass</uri>
- <alias id="Article" displayName="Article">
- <descrīption>Article alias</descrīption>
- <uri>http://com/darkhe/sample/mycompass/alias/Article</uri>
- <name>Article</name>
- </alias>
- <meta-data id="ArticleTitle" displayName="ArticleTitle">
- <descrīption>ArticleTitle</descrīption>
- <uri>http://com/darkhe/sample/mycompass/alias/ArticleTitle</uri>
- <name>ArticleTitle</name>
- </meta-data>
- <meta-data id="PublishDate" displayName="PublishDate">
- <descrīption>PublishDate</descrīption>
- <uri>http://com/darkhe/sample/mycompass/alias/PublishDate</uri>
- <name format="yyyy-MM-dd hh:mm:ss">date</name>
- </meta-data>
- <meta-data id="Summary" displayName="Summary">
- <descrīption>Summary</descrīption>
- <uri>http://com/darkhe/sample/mycompass/alias/Summary</uri>
- <name>Summary</name>
- </meta-data>
- <meta-data id="Content" displayName="Content">
- <descrīption>Content</descrīption>
- <uri>http://com/darkhe/sample/mycompass/alias/Content</uri>
- <name>Content</name>
- </meta-data>
- <meta-data id="KeyList" displayName="KeyList">
- <descrīption>KeyList</descrīption>
- <uri>http://com/darkhe/sample/mycompass/alias/KeyList</uri>
- <name>KeyList</name>
- </meta-data>
- </meta-data-group>
- </compass-core-meta-data>
11. 再是mycompass.cpm.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE compass-core-mapping PUBLIC "-//Compass/Compass Core Mapping DTD 1.0//EN"
- "http://www.opensymphony.com/compass/dtd/compass-core-mapping.dtd">
- <compass-core-mapping package="com.darkhe.sample.mycompass">
- <beans>
- <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
- <property name="location">
- <value>classpath:jdbc.properties</value>
- </property>
- </bean>
- <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
- <property name="driverClassName">
- <value>${jdbc.driverClassName}</value>
- </property>
- <property name="url">
- <value>${jdbc.url}</value>
- </property>
- <property name="username">
- <value>${jdbc.username}</value>
- </property>
- <property name="password">
- <value>${jdbc.password}</value>
- </property>
- </bean>
- <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
- <property name="dataSource">
- <ref local="dataSource" />
- </property>
- <property name="mappingResources">
- <list>
- <value>com/darkhe/sample/mycompass/Article.hbm.xml</value>
- </list>
- </property>
- <property name="hibernateProperties">
- <props>
- <prop key="hibernate.dialect">${hibernate.dialect}</prop>
- <prop key="hibernate.show_sql">false</prop>
- <prop key="hibernate.generate_statistics">true</prop>
- </props>
- </property>
- <property name="eventListeners">
- <map>
- <entry key="merge">
- <bean class="org.springframework.orm.hibernate3.support.IdTransferringMergeEventListener" />
- </entry>
- </map>
- </property>
- </bean>
- <bean id="compass" class="org.compass.spring.LocalCompassBean">
- <property name="resourceLocations">
- <list>
- <value>classpath:mycompass.cmd.xml</value>
- <value>classpath:mycompass.cpm.xml</value>
- </list>
- </property>
- <property name="configLocation">
- <value>classpath:mycompass.cfg.xml</value>
- </property>
- </beans>
15. 注意上面的所以配置文件,根据我们上面的配置,都应当放到classpath的根路径。
16. 建立工具类,用来进行spring引擎的初始化工作。
- /**
- *
@(#) IOC.java 2006-2-1 0:08:23
- *
Copyright (c) 2005-2006 ???????????????????
- */
- package com.darkhe.sample.mycompass;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- /**
- *
- *
- * @version 1.0 2006-2-1
- * @author darkhe
- */
- public class IOC {