Compass學習文檔(1) (轉)

 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:

Java代碼
  1. package org.li.compass;   
  2.   
  3. import java.util.Date;   
  4.   
  5. public class Article   
  6.   
  7. {   
  8.   
  9.     private long id;   
  10.   
  11.     private String title;   
  12.   
  13.     private String content;   
  14.   
  15.     private Date publishDate;   
  16.   
  17.     public String getContent()   
  18.   
  19.     {   
  20.   
  21.         return content;   
  22.   
  23.     }   
  24.   
  25.     public void setContent(String content)   
  26.   
  27.     {   
  28.   
  29.         this.content = content;   
  30.   
  31.     }   
  32.   
  33.     public Date getPublishDate()   
  34.   
  35.     {   
  36.   
  37.         return publishDate;   
  38.   
  39.     }   
  40.   
  41.     public void setPublishDate(Date publishDate)   
  42.   
  43.     {   
  44.   
  45.         this.publishDate = publishDate;   
  46.   
  47.     }   
  48.   
  49.     public String getTitle()   
  50.   
  51.     {   
  52.   
  53.         return title;   
  54.   
  55.     }   
  56.   
  57.     public void setTitle(String title)   
  58.   
  59.     {   
  60.   
  61.         this.title = title;   
  62.   
  63.     }   
  64.   
  65.     public long getId()   
  66.   
  67.     {   
  68.   
  69.         return id;   
  70.   
  71.     }   
  72.   
  73.     public void setId(long id)   
  74.   
  75.     {   
  76.   
  77.         this.id = id;   
  78.   
  79.     }   
  80.   
  81. }  
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

Xml代碼
  1. <!DOCTYPE compass-core-configuration PUBLIC   
  2.   
  3.     "-//Compass/Compass Core Configuration DTD 1.0//EN"   
  4.   
  5.     "http://www.opensymphony.com/compass/dtd/compass-core-configuration.dtd">  
  6.   
  7. <compass-core-configuration>  
  8.   
  9.     <compass>  
  10.   
  11.         <setting name="compass.engine.connection">target/test</setting><!-- 這裏配置的是索引的相對路徑 -->  
  12.   
  13.         <mapping resource="org/li/compass/Article.cpm.xml"/><!-- 這裏是每個對象的映射文件 -->  
  14.   
  15.     </compass>  
  16.   
  17. </compass-core-configuration>  

 這是Compass的配置文件上面標明瞭索引目錄和映射文件。映射好文件了就看看這個映射的什麼吧

3. Article.cpm.xml

Xml代碼
  1. <!DOCTYPE compass-core-mapping PUBLIC    
  2.   
  3.     "-//Compass/Compass Core Mapping DTD 1.0//EN"   
  4.   
  5.     "http://www.opensymphony.com/compass/dtd/compass-core-mapping.dtd">  
  6.   
  7. <compass-core-mapping package="org.li.compass">  
  8.   
  9.     <class name="Article" alias="article">  
  10.   
  11.         <!-- 這是必須有的 -->  
  12.   
  13.         <id name="id"/>  
  14.   
  15.         <!-- 你可以通過這個配置來在底層給這個對象加一個Field("type","java") -->  
  16.   
  17.         <constant>  
  18.   
  19.             <meta-data>type</meta-data>  
  20.   
  21.             <meta-data-value>java</meta-data-value>  
  22.   
  23.         </constant>  
  24.   
  25.         <!-- 配置一下屬性 -->  
  26.   
  27.         <property name="title">  
  28.   
  29.             <meta-data>titleIndex</meta-data>  
  30.   
  31.         </property>  
  32.   
  33.         <property name="content">  
  34.   
  35.             <meta-data>contentIndex</meta-data>  
  36.   
  37.         </property>  
  38.   
  39.         <property name="publishDate">  
  40.   
  41.             <meta-data>publishDateIndex</meta-data>  
  42.   
  43.         </property>  
  44.   
  45.     </class>  
  46.   
  47. </compass-core-mapping>  

 

      這個配置應該可以看的懂吧可能會有人問meta-data是幹什麼用的??

      它的值是作爲底層Field的名字,如果沒有配置的話Compass用$article/…來代替。而它的作用是配置對象的屬性的儲存形式,Compass就是讀取它來new Field()的:

Xml代碼
  1. <!ELEMENT meta-data (   
  2.     #PCDATA   
  3. )>  
  4.     <!ATTLIST meta-data store (no|yes|compress) "yes">  
  5.     <!ATTLIST meta-data index (no|tokenized|un_tokenized) "tokenized">  
  6.     <!ATTLIST meta-data term-vector (no|yes|positions|offsets|positions_offsets) "no">  
  7.     <!ATTLIST meta-data reverse (no|reader|string) "no">  
  8.     <!ATTLIST meta-data analyzer CDATA #IMPLIED>  
  9.     <!ATTLIST meta-data exclude-from-all (true|false) #IMPLIED>  
  10.     <!ATTLIST meta-data converter CDATA #IMPLIED>  
  11.     <!ATTLIST meta-data format CDATA #IMPLIED>  
  12.     <!ATTLIST meta-data boost CDATA #IMPLIED>  

 4.JUnit插入測試

Java代碼
  1. public void InsertCompass()   
  2.   
  3.     {   
  4.   
  5. CompassConfiguration comConfig = new CompassConfiguration().configure().addClass(Article.class);   
  6.   
  7.         Compass com = comConfig.buildCompass();   
  8.   
  9.         CompassSession comSession = com.openSession();   
  10.   
  11.         CompassTransaction comTx = comSession.beginTransaction();   
  12.   
  13.            
  14.   
  15.         Article article = new Article();   
  16.   
  17.         article.setContent("Compass是第一個基於lucene的java開源框架");   
  18.   
  19.         article.setTitle("學習Compass");   
  20.   
  21.         article.setPublishDate(new Date());   
  22.   
  23.         comSession.save(article);   
  24.   
  25.         comTx.commit();   
  26.   
  27.     }  
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將是非常容易的。

      看看效果如何:

Java代碼
  1. public void LoadCompass()   
  2.   
  3.     {   
  4.   
  5.         CompassConfiguration comConfig = new CompassConfiguration().configure().addClass(Article.class);   
  6.   
  7.         Compass com = comConfig.buildCompass();   
  8.   
  9.         CompassSession comSession = com.openSession();   
  10.   
  11.         CompassTransaction comTx = comSession.beginTransaction();   
  12.   
  13.            
  14.   
  15.         Article article = (Article)comSession.load(Article.class0);   
  16.   
  17.         System.out.println(article.getTitle());   
  18.   
  19.         System.out.println(article.getContent());   
  20.   
  21.         System.out.println(article.getPublishDate());   
  22.   
  23.     }  
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測試用例:

Java代碼
  1. public void TestArticle() throws ParseException, IOException   
  2.   
  3.     {   
  4.   
  5.         QueryParser queryParser = new QueryParser("titleIndex",new StandardAnalyzer());   
  6.   
  7.         Query query = queryParser.parse("compass");   
  8.   
  9.         IndexSearcher indexSearcher = new IndexSearcher("target/test/index/article");   
  10.   
  11.         Hits hits = indexSearcher.search(query);   
  12.   
  13.         for(int i=0;i<hits.length();i++)   
  14.   
  15.         {   
  16.   
  17.             Document doc = hits.doc(i);   
  18.   
  19.             System.out.println(doc.get("contentIndex"));//大家可以在這裏設置個斷點看一下doc裏各個Field是什麼。就會學到很多的東西   
  20.   
  21.         }   
  22.   
  23. }  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章