Compass学习文档(1)
作者:javafish
Compass是第一个实现java搜索引擎的开源框架,它是基于 Lucene之上的,提供更简单的搜索引擎API,事务支持,对象到搜索引擎映射(Annotations & XML),Xml到搜索引擎映射,可以和Hibernate,Spring集成,功能非常的强大。如果用Hibernate,Spring做的项目需要搜 索引擎的话,Compass是个非常好的选择。个人认为:如果说Lucene是搜索引擎中的JDBC,那么Compass就是Hibernate。而 Compass和Hibernate不仅仅是比喻的像,它们的类和用法,和作用也非常的像。Compass是用面向对象编程方法来实现搜索。如果会 Hibernate的话学Compass是非常容易的。
大家可以到http://www.opensymphony.com/compass/download.action去下载最新的版本。2006年8月28日Compass 1.1 M1 发布,用的是Lucene2.0,现在讲的就是这个版本。
虽 然有人说Hibernate3.1以后版本自带了对Lucene的支持,Compass好像没用,但是只要看一下Hibernate源代码可以看出 Hibernate对Lucene的支持很简陋,且不支持事务并且Hibernate3.2用的还是Lucene版本是Lucene1.4.3,所以说当 做大的项目的时候Compass还是非常有必要的。
还是先看个HelloWorld程序:(这里的测试功能的例子都是用的JUnit测试用例,为方便阅读异常全部抛出)
一共4个文件Article.java, compass.cfg.xml,Article.cpm.xml,JUnit插入测试。
1.Article.java:

package  org.li.compass;

import  java.util.Date;

public   class  Article
{
 
private long id;
 
private String title;
 
private String content;
 
private Date publishDate;
 
public String getContent()
 
{
  
return content;
 }

 
public void setContent(String content)
 
{
  
this.content = content;
 }

 
public Date getPublishDate()
 
{
  
return publishDate;
 }

 
public void setPublishDate(Date publishDate)
 
{
  
this.publishDate = publishDate;
 }

 
public String getTitle()
 
{
  
return title;
 }

 
public void setTitle(String title)
 
{
  
this.title = title;
 }

 
public long getId()
 
{
  
return id;
 }

 
public void setId(long id)
 
{
  
this.id = id;
 }

}

上面就是一个Article的POJO类上面有文章题目,内容,发布时间,这里的id的compass必须的(有点和数据库一样了)。
2.compass.cfg.xml
<! DOCTYPE compass-core-configuration PUBLIC
    "-//Compass/Compass Core Configuration DTD 1.0//EN"
    "http://www.opensymphony.com/compass/dtd/compass-core-configuration.dtd"
>
< compass-core-configuration >
 
< compass >
  
< setting  name ="compass.engine.connection" > target/test </ setting > <!--  这里配置的是索引的相对路径  -->
  
< mapping  resource ="org/li/compass/Article.cpm.xml" /> <!--  这里是每个对象的映射文件  -->
 
</ compass >
</ compass-core-configuration >

这是Compass的配置文件上面标明了索引目录和映射文件。映射好文件了就看看这个映射的什么吧
3. Article.cpm.xml
<! 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 ="org.li.compass" >
 
< class  name ="Article"  alias ="article" >
  
<!--  这是必须有的  -->
  
< id  name ="id" />
  
<!--  你可以通过这个配置来在底层给这个对象加一个Field("type","java")  -->
  
< constant >
   
< meta-data > type </ meta-data >
   
< meta-data-value > java </ meta-data-value >
  
</ constant >
  
<!--  配置一下属性  -->
  
< property  name ="title" >
   
< meta-data > titleIndex </ meta-data >
  
</ property >
  
< property  name ="content" >
   
< meta-data > contentIndex </ meta-data >
  
</ property >
  
< property  name ="publishDate" >
   
< meta-data > publishDateIndex </ meta-data >
  
</ property >
 
</ class >
</ compass-core-mapping >

这个配置应该可以看的懂吧可能会有人问meta-data是干什么用的??
它的值是作为底层Field的名字,如果没有配置的话Compass用$article/…来代替。而它的作用是配置对象的属性的储存形式,Compass就是读取它来new Field()的:
<!ELEMENT meta-data (
    #PCDATA
)>
    <!ATTLIST meta-data store (no|yes|compress) "yes">
    <!ATTLIST meta-data index (no|tokenized|un_tokenized) "tokenized">
    <!ATTLIST meta-data term-vector (no|yes|positions|offsets|positions_offsets) "no">
    <!ATTLIST meta-data reverse (no|reader|string) "no">
    <!ATTLIST meta-data analyzer CDATA #IMPLIED>
    <!ATTLIST meta-data exclude-from-all (true|false) #IMPLIED>
    <!ATTLIST meta-data converter CDATA #IMPLIED>
    <!ATTLIST meta-data format CDATA #IMPLIED>
    <!ATTLIST meta-data boost CDATA #IMPLIED>
4.JUnit插入测试
public   void  InsertCompass()
 
{
CompassConfiguration comConfig 
= new CompassConfiguration().configure().addClass(Article.class);
  Compass com 
= comConfig.buildCompass();
  CompassSession comSession 
= com.openSession();
  CompassTransaction comTx 
= comSession.beginTransaction();
  
  Article article 
= new Article();
  article.setContent(
"Compass是第一个基于lucene的java开源框架");
  article.setTitle(
"学习Compass");
  article.setPublishDate(
new Date());
  comSession.save(article);
  comTx.commit();
 }

当大家看到这里的时候就看出来Compass和Hibernate太像了。如果会Hibernate的话,学Compass将是非常容易的。
看看效果如何:
public   void  LoadCompass()
 
{
  CompassConfiguration comConfig 
= new CompassConfiguration().configure().addClass(Article.class);
  Compass com 
= comConfig.buildCompass();
  CompassSession comSession 
= com.openSession();
  CompassTransaction comTx 
= comSession.beginTransaction();
  
  Article article 
= (Article)comSession.load(Article.class0);
  System.out.println(article.getTitle());
  System.out.println(article.getContent());
  System.out.println(article.getPublishDate());
 }

结果:
学习Compass
Compass是第一个基于lucene的java开源框架
Sat Sep 23 00:51:35 CST 2006

注意:和其它的框架一样,Compass也是需要一定的配置的,而Compass的数据配置可分为Annotations,DTD验证的XML和Schema验证的XML。这里用的是dtd验证的XML配置。
我们可以用Lucene做一下检测嘛
JUnit测试用例:
public void TestArticle() throws ParseException, IOException
 {
  QueryParser queryParser = new QueryParser("titleIndex",new StandardAnalyzer());
  Query query = queryParser.parse("compass");
  IndexSearcher indexSearcher = new IndexSearcher("target/test/index/article");
  Hits hits = indexSearcher.search(query);
  for(int i=0;i<hits.length();i++)
  {
   Document doc = hits.doc(i);
   System.out.println(doc.get("contentIndex"));//大家可以在这里设置个断点看一下doc里各个Field是什么。就会学到很多的东西
  }
Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐