导读:
  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 

  /"-//Compass/Compass Core Configuration DTD 1.0//EN/" 

  /"http://www.opensymphony.com/compass/dtd/compass-core-configuration.dtd/"> 

   

  target/test 

   

   

  这是Compass的配置文件上面标明了索引目录和映射文件。映射好文件了就看看这个映射的什么吧 

  3. Article.cpm.xml 

  /"-//Compass/Compass Core Mapping DTD 1.0//EN/" 

  /"http://www.opensymphony.com/compass/dtd/compass-core-mapping.dtd/"> 

   

   

   

   

   

  type 

  java 

   

   

   

  titleIndex 

   

   

  contentIndex


  这个配置应该可以看的懂吧可能会有人问meta-data是干什么用的??
  它的值是作为底层Field的名字,如果没有配置的话Compass用$article/…来代替。而它的作用是配置对象的属性的储存形式,Compass就是读取它来new Field()的:
  #PCDATA
  )>
  
  
  
  
  
  
  
  
  
  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.class, 0); 

  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 { 

  Document doc = hits.doc(i); 

  System.out.println(doc.get(/"contentIndex/"));//大家可以在这里设置个断点看一下doc里各个Field是什么。就会学到很多的东西 

  } 

  } 

  [upload=1][/upload] 

  --