compass 简单教程

来源:互联网 发布:nba2k14优化伴侣 编辑:程序博客网 时间:2024/06/05 04:16
Compass 下简化的索引建立过程   在lucene 下建立索引的过程是自己用JDBC 跑SQL 获得ResultSet,遍历ResultSet建立Document对象并用IndexWriter写入文件目录。 

    在Compass下就变成一个宣告的过程: 
3.1 宣告待搜索的POJO 

   @SearchableId 宣告Document的id列; 

   @SearchableProperty 宣告要索引的field; 

   @SearchableComponent宣告关联其他对象如Category分类。 

public   class  Product  { 
  @SearchableId 
  private  Integer id; 

  @SearchableProperty 
  private String name; 

  @SearchableComponent 
  private Category category; 


3.2 定义CompassGps 

      CompassGps是Compass下用来建立索引,Mirror Data Change的类。 

      在ApplicationContext.xml定义了Compass与Spring的集成,配置参数,并让GPS随ApplicationContext启动开始监控Hibernate的DataChange : 

    * Compass:核心定义类,定义要搜索的POJO 和 索引存储的路径。 
    * CompassGPS: 定义使用了Hibernate3GPS,定义了init-method 和destory-method,会自动随ApplicaitonContext的启动,开始监控Hibernate的变化。 

<bean id="compass" class="org.compass.spring.LocalCompassBean"> 
<!-- anontaition式设置 --> 
<property name="classMappings"> 
<list> 
<value>org.springside.bookstore.model.Book</value> 
<value>org.springside.bookstore.model.Category</value> 
</list> 
</property> 

<property name="compassConfiguration"> 
<bean class="org.compass.annotations.config.CompassAnnotationsConfiguration"/> 
</property> 

<property name="compassSettings"> 
<props> 
<prop key="compass.engine.connection"> 
file://${user.home}/springside/compass 
</prop> 
<prop key="compass.transaction.factory"> 
org.compass.spring.transaction.SpringSyncTransactionFactory 
</prop> 
</props> 
</property> 

<property name="transactionManager" ref="transactionManager"/> 
</bean> 

<!-- Compass中建立索引与mirror database change的部件 --> 
<bean id="compassGps" class="org.compass.gps.impl.SingleCompassGps" 
  init-method="start" destroy-method="stop"> 
<property name="compass" ref="compass"/> 
<property name="gpsDevices"> 
<list> 
<bean class="org.compass.spring.device.hibernate.SpringHibernate3GpsDevice"> 
<property name="name" value="hibernateDevice"/> 
<property name="sessionFactory" ref="sessionFactory"/> 
</bean> 
</list> 
</property> 
</bean> 

  只需要在AdvancedSearchCommand 上将需要highlighting 的Fields 加入即可。 

  searchCommand.setHighlightFields(new String[] {"name"}); 

4.2 定义高亮的样式 

另外,如果对高亮显示的效果不满意的话,可以在applicationContext-compass.xml 文件里配置: 

    <prop key="compass.engine.highlighter.default.formatter.simple.pre"> 
     <![CDATA[<font color="red"><b>]]> 
    </prop> 
    <prop key="compass.engine.highlighter.default.formatter.simple.post"> 
     <![CDATA[</b></font>]]> 
    </prop> 
编写一个测试类MyCompass类,如下所示:
package org.shirdrn.compass.main;
import org.compass.core.Compass;
import org.compass.core.CompassHits;
import org.compass.core.CompassSession;
import org.compass.core.CompassTransaction;
import org.compass.core.config.CompassConfiguration;
import org.shirdrn.compass.document.Book;
public class MyCompass {

private static Compass compass;
static{    // 解析Compass配置文件,加载Book实体类
   CompassConfiguration config = new CompassConfiguration();
   config.configure("/org/shirdrn/compass/compass.cfg.xml");
   config.addClass(Book.class);
   compass = config.buildCompass();
}

private Book addBookA(){ //   构造一个Book实例,实际上是构造了一个Document,并向其中添加Field
   Book book = new Book();
   book.setBookNo("ISBN 987-5-624-16000-8/TP");
   book.setBookName("Compass框架技术");
   book.setAuthor("飞云居士");
   book.setCategory("Java");
   String contents = "Compass是封装了Lucene的一个功能强大的框架。"+
       "Compass简单易学,这使得开发者可以像使用Hibernate一样轻松地开发自己的搜索引擎。"+
       "即使对Lucene并不是很熟悉,使用Compass框架开发使你变得游刃有余。";
   book.setContents(contents);
   book.setPrice(new Double(23.00));
   return book;
}

private Book addBookB(){
   Book book = new Book();
   book.setBookNo("ISBN 388-2-244-16000-9/TP");
   book.setBookName("鬼吹灯");
   book.setAuthor("本物天下霸唱");
   book.setCategory("考古小说类");
   String contents = "几位“摸金校尉”(盗墓贼)通过风水秘术在发掘古墓时的诡异经历。"+
       "主人公胡八一祖传的风水秘书残卷,上山下乡时误入大山深处的辽代古墓,"+
       "参军时在昆仑山大冰川发现的九层妖楼,东北中蒙边境的关东军秘密地下...";
   book.setContents(contents);
   book.setPrice(new Double(58.50));
   return book;
}

private void createIndex(Book book) {    // 建立索引,与Hibernate很相似
   CompassSession session = compass.openSession();
   CompassTransaction tx = session.beginTransaction();
   session.save(book);
   tx.commit();
   session.close();
}

private void search(String keyword) {    // 根据关键字keyword检索
   CompassSession session = compass.openSession();
   CompassTransaction tx = session.beginTransaction();
   CompassHits hits = session.find(keyword);
   System.out.println("检索关键字 "+keyword+" 的检索结果如下:");
   System.out.println("********************************************");
   for (int i = 0; i < hits.getLength(); i++) {
    Book book = (Book)hits.data(i);
    System.out.println("书的编号为: "+book.getBookNo());
    System.out.println("书的名称为: "+book.getBookName());
    System.out.println("书的作者为: "+book.getAuthor());
    System.out.println("书的类别为: "+book.getCategory());
    System.out.println("书的内容为: "+book.getContents());
    System.out.println("书的定价为: "+book.getPrice());
    System.out.println("********************************************");
   }
   System.out.println("共检索出结果 "+hits.length()+" 个。");
   hits.close();
   tx.commit();
   session.close();
   compass.close();
}

public static void main(String[] args) {
   MyCompass myCompass = new MyCompass();
   myCompass.createIndex(myCompass.addBookA());
   myCompass.createIndex(myCompass.addBookB());
   myCompass.search("鬼吹灯");
}
}
通过两个方法:addBookA()和addBookB()构造两个Book实例,要为它们建立索引。
当执行上面测试函数的时候,会在工程目录下生成如下索引目录:
\target\index\index\book\
在索引目录下生成建立的索引文件。
通过Book的bookName来检索,检索关键字“鬼吹灯”,运行结果如下所示:
检索关键字 鬼吹灯 的检索结果如下:
********************************************
书的编号为: ISBN 388-2-244-16000-9/TP
书的名称为: 鬼吹灯
书的作者为: 本物天下霸唱
书的类别为: 考古小说类
书的内容为: 几位“摸金校尉”(盗墓贼)通过风水秘术在发掘古墓时的诡异经历。主人公胡八一祖传的风水秘书残卷,上山下乡时误入大山深处的辽代古墓,参军时在昆仑山大冰川发现的九层妖楼,东北中蒙边境的关东军秘密地下...
书的定价为: 58.5
********************************************
共检索出结果 1 个。
如果想要通过文章中词条作为关键字来检索,也一样,比如检索关键字“的”,因为它在两个Book的内容中都出现了,预测应该能检索出两个Book。
看运行结果,如下所示:
检索关键字 的 的检索结果如下:
********************************************
书的编号为: ISBN 388-2-244-16000-9/TP
书的名称为: 鬼吹灯
书的作者为: 本物天下霸唱
书的类别为: 考古小说类
书的内容为: 几位“摸金校尉”(盗墓贼)通过风水秘术在发掘古墓时的诡异经历。主人公胡八一祖传的风水秘书残卷,上山下乡时误入大山深处的辽代古墓,参军时在昆仑山大冰川发现的九层妖楼,东北中蒙边境的关东军秘密地下...
书的定价为: 58.5
********************************************
书的编号为: ISBN 987-5-624-16000-8/TP
书的名称为: Compass框架技术
书的作者为: 飞云居士
书的类别为: Java
书的内容为: Compass是封装了Lucene的一个功能强大的框架。Compass简单易学,这使得开发者可以像使用Hibernate一样轻松地开发自己的搜索引擎。即使对Lucene并不是很熟悉,使用Compass框架开发使你变得游刃有余。
书的定价为: 23.0
********************************************
共检索出结果 2 个。
修改和删除索引,需要通过一个实体类对象的唯一标识来定位该索引文件,然后对其删除或者修改,比如上面的Book中bookNo就可以标识一个Book对象,通过指定一个bookNo,通过CompassSession的delete方法进行删除。
删除索引的操作也是非常简单的,如下所示:
private void deleteIndex(Book book) { // 删除索引,与Hibernate很相似
   CompassSession session = compass.openSession();
   CompassTransaction tx = session.beginTransaction();
   session.delete(book);
   tx.commit();
   session.close();
}
修改索引与Hibernate稍有不同,实际上是先把原来已经存在的索引删除掉,之后再重新创建索引,如下所示:

private void updateIndex(Book book) { // 修改索引
   CompassSession session = compass.openSession();
   CompassTransaction tx = session.beginTransaction();
   session.delete(book);
   session.save(book);
   tx.commit();
   session.close();
}