COMPASS+spring 构建自己的搜索引擎.docx
- 文档编号:3878020
- 上传时间:2023-05-06
- 格式:DOCX
- 页数:37
- 大小:24.12KB
COMPASS+spring 构建自己的搜索引擎.docx
《COMPASS+spring 构建自己的搜索引擎.docx》由会员分享,可在线阅读,更多相关《COMPASS+spring 构建自己的搜索引擎.docx(37页珍藏版)》请在冰点文库上搜索。
COMPASS+spring构建自己的搜索引擎
COMPASS+spring构建自己的搜索引擎
在新架构中打算选择Compass或HibernateSearch作为搜索引擎框架,比较后,感觉HibernateSearch上还是没有Compass成熟,另外考虑到后期对网页的爬取及搜索需求,决定还是基于Compass来作为架构缺省的搜索引擎。
网上关于Compass的文档很多,但说得相对完整其详细的入门文档基本上没有,Compass的官方文档倒是说得很详细,但是例子一塌糊涂,存在很大问题。
记录一下搭建的过程,作为入门的指南。
Compass通过OSEM(Object/SearchEngineMapping)允许把应用对象的领域模型映射到搜索引擎,最终通过访问commonmetadata来达到访问对象的目的。
1、几个核心概念
1.1、annotationvs.xml配置文件
Compass的配置文件主要分成三类:
第一类:
*.cmd.xml文件*
.cmd.xml文件是对commonmetadata进行定义,定义了最终搜索的结果中的最基本的元数据。
第二类:
*.cpm.xml文件
*.cpm.xml是Object/SearchEngineMapping,提供了POJO到commonmetadata的映射。
第三类:
*.cfg.xml文件
Compass的*.cfg.xml定义了Compass的Index存放路径、搜索引擎分词等相关信息。
与采用xml配置文件相比较,采用Annonation方式还是相对简单,尤其是采用Spring时候,不用写*.cmd.xml文件、*.cpm.xml、*.cfg.xml,相对很方便,而且不像Hibernate的Annonation很多,Compass的Annonation的核心标注只有@Searchable、@SearchableId、@SearchableProperty、@SearchableComponent个,很容易记忆。
因此推荐使用Annonation方式
1.2、Compass核心API
Compass的核心API借鉴了Hibernate的术语,因此在操作上基本上与Hibernate类似,以下为Compass的几个核心接口:
CompassConfiguration(类似HibernateConfiguration):
用来在一些设置参数、配置文件和映射定义上配置Compass。
通常用来创建Compass接口。
Compass(类似HibernateSessionFactory):
为单线程使用,创建线程安全的实例来打开CompassSeesion。
同样还提供了一些搜索引擎索引级别的操作。
CompassSesssion(类似HibernateSession):
用来执行像保存、删除、查找、装载这样的搜索操作。
很轻量但是并不是线程安全的。
CompassTransaction(类似HibernateTransaction):
管理Compass事务的接口。
使用它并不需要事务管理环境(像Spring、JTA)。
1.3、Compass与Spring集成
Compass已经对对spring集成做了很好的封装,同时与Spring对Hibernate的支持类似,Compass也提供了CompassTemplate来简化诸如对Session、Transaction、Exception等操作,尽量充分使用此工具,可以有效提高效率。
例如:
CompassTemplatect=(CompassTemplate)context.getBean("compassTemplate");
Articlearticle=newArticle();
article.setTitle("CompassTest");
article.setPublishDate(newDate());
article.setAuthor
(1);
ct.save(article);//存储对象需要索引的数据到Compass的索引中。
2、软件环境
Spring:
2.5
Compas:
1.2.1
Hibernate:
3.2.5
Mysql:
5.0.5
3、数据库脚本
CREATETABLE`article`(
`Id`int(11)NOTNULLauto_increment,
`title`varchar(40)NOTNULLdefault'',
`author`int(11)default'0',
`publish_date`dateNOTNULLdefault'0000-00-00',
PRIMARYKEY(`Id`))TYPE=MyISAM;
CREATETABLE`author`(
`Id`int(11)NOTNULLauto_increment,
`username`varchar(20)NOTNULLdefault'',
`password`varchar(20)NOTNULLdefault'',
`age`smallint(6)default'0',
PRIMARYKEY(`Id`))TYPE=MyISAM;
4、测试用例
从测试用例讲起比较容易把关系理清楚,不然一堆术语和概念很让人晕乎。
importorg.apache.log4j.Logger;
importjava.util.Date;
importjunit.framework.TestCase;
importpass.core.Compass;
importpass.core.CompassDetachedHits;
importpass.core.CompassHit;
importpass.core.CompassHits;
importpass.core.CompassSession;
importpass.core.CompassTemplate;
importpass.core.CompassTransaction;
importpass.core.support.search.CompassSearchCommand;
importpass.core.support.search.CompassSearchResults;
importorg.springframework.context.support.ClassPathXmlApplicationContext;
importcom.mobilesoft.esales.dao.hibernate.ArticleDAO;
importcom.mobilesoft.esales.dao.hibernate.AuthorDAO;
importcom.mobilesoft.esales.model.Article;
importcom.mobilesoft.esales.model.Author;
importcom.mobilesoft.framework.search.service.CompassSearchService;
/**
*Compass服务使用的测试用例
*
*@authorliangchuan@mobile-
*
*/
publicclassTestCompassextendsTestCase{
privatestaticfinalLoggerlogger=Logger.getLogger(TestCompass.class);
privatestaticClassPathXmlApplicationContextcontext=null;
privatestaticCompassTemplatect;
static{
context=newClassPathXmlApplicationContext(newString[]{
"applicationContext.xml","applicationContext-resources.xml",
"applicationContext-dao.xml","applicationContext-service.xml",
"applicationContext-compass.xml"});
ct=(CompassTemplate)context.getBean("compassTemplate");
}
protectedvoidsetUp()throwsException{
}
/**
*插入测试数据
*/
publicvoidtestInsert(){
ArticleDAOarticleDao=(ArticleDAO)context.getBean("articleDAO");
AuthorDAOauthorDao=(AuthorDAO)context.getBean("authorDAO");
Articlearticle=newArticle();
Authorauthor=newAuthor();
author.setAge((short)27);
author.setUsername("liangchuan");
author.setPassword("liangchuan");
article.setTitle("CompassTest");
article.setPublishDate(newDate());
article.setAuthor
(1);
authorDao.save(author);
articleDao.save(article);
ct.save(article);
ct.save(author);
}
/**
*用于测试使用CompassTransaction事务方式
*/
publicvoidtestTransactionalFind(){
Compasscompass=ct.getCompass();
CompassSessionsession=compass.openSession();
CompassTransactiontx=null;
try{
tx=session.beginTransaction();
CompassHitshits=session.find("Compass*");
logger.error("testTransactionalFind()-CompassHitshits="
+hits.getLength());
for(inti=0;i Objecthit=hits.data(i); if(hitinstanceofArticle){ Articleitem=(Article)hit; logger.error("testTransactionalFind()-articlehits=" +item.getTitle()); }elseif(hitinstanceofAuthor){ Authoritem=(Author)hit; logger.error("testTransactionalFind()-authorhits=" +item.getUsername()); }else{ logger.error("testTransactionalFind()-errorhits="); } } mit(); }catch(Exceptione){ if(tx! =null){ tx.rollback(); } }finally{ session.close(); } } /** *用于演示CompassDetachedHits的使用。 *由于CompassTempalte得到的结果集必须在transactionalcontext中才能使用, *因此必须使用CompassDetachedHits方式测试CompassDetachedHits方式 */ publicvoidtestDetachedFind(){ //由于CompassTempalte得到的结果集必须在transactional //context中才能使用,因此必须使用CompassDetachedHits方式 //测试CompassDetachedHits方式 CompassDetachedHitshits=ct.findWithDetach("Compass*"); logger.error("testDetachedFind()-CompassHitshits=" +hits.getLength()); for(inti=0;i Objecthit=hits.data(i); if(hitinstanceofArticle){ Articleitem=(Article)hit; logger.error("testDetachedFind()-articlehits=" +item.getTitle()); }elseif(hitinstanceofAuthor){ Authoritem=(Author)hit; logger.error("testDetachedFind()-authorhits=" +item.getUsername()); }else{ logger.error("testDetachedFind()-errorhits="); } } } /** *用于演示com.mobilesoft.framework.search.service.CompassSearchService的使用 * */ classCompassSearchextendsCompassSearchService{ CompassSearch(){ Compasscompass=ct.getCompass(); CompassSessionsession=compass.openSession(); CompassTransactiontx=null; try{ tx=session.beginTransaction(); CompassSearchCommandcommand=newCompassSearchCommand(); command.setQuery("Compass"); CompassSearchResultsresults=performSearch(command,session); logger.error("CompassSearch()-CompassHitTotalHitsvalue="+results.getTotalHits()); for(inti=0;i CompassHithits=results.getHits()[i]; Objecthit=hits.getData(); logger.error("CompassSearch()-CompassHithit="+hit);//$NON-NLS-1$ if(hitinstanceofArticle){ Articleitem=(Article)hit; logger.error("testCompassSearchService()-articlehits=" +item.getTitle()); }elseif(hitinstanceofAuthor){ Authoritem=(Author)hit; logger.error("testCompassSearchService()-authorhits=" +item.getUsername()); }else{ logger.error("testCompassSearchService()-errorhits="); } mit(); } }catch(Exceptione){ if(tx! =null){ tx.rollback(); } }finally{ session.close(); } } } publicvoidtestCompassSearchService(){ newCompassSearch(); } protectedvoidtearDown()throwsException{ } } 5、配置文件 applicationContext-compass.xml applicationContext-dao.xml、applicationContext-service.xml、applicationContext-resources.xml等略去。 xmlversion="1.0"? > DOCTYPEbeansPUBLIC"-//SPRING//DTDBEAN2.0//EN" "http: //www.springframework.org/dtd/spring-beans-2.0.dtd"> class="pass.annotations.config.CompassAnnotationsConfiguration"> //compass pass.spring.transaction.SpringSyncTransactionFactory key="compass.engine.highlighter.default.formatter.simple.pre"> [CDATA[ key="compass.engine.highlighter.default.formatter.simple.post"> [CDATA[]]> class="pass.gps.device.hibernate.HibernateGpsDevice"> init-method="start"destroy-method="stop"> cla
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- COMPASS+spring 构建自己的搜索引擎 COMPASS spring 构建 自己 搜索引擎
![提示](https://static.bingdoc.com/images/bang_tan.gif)