posts - 33,  comments - 11,  trackbacks - 0
           

          Compass是第一個實現java搜索引擎的開源框架,它是基于Lucene之上的,提供更簡單的搜索引擎API,事務支持,對象到搜索引擎映射(Annotations & XML),Xml到搜索引擎映射,可以和Hibernate,Spring集成,功能非常的強大。如果用Hibernate,Spring做的項目需要搜索引擎的話,Compass是個非常好的選擇。個人認為:如果說Lucene是搜索引擎中的JDBC,那么Compass就是Hibernate。CompassHibernate不僅僅是比喻的像,它們的類和用法,和作用也非常的像。Compass是用面向對象編程方法來實現搜索。如果會Hibernate的話學Compass是非常容易的。

          大家可以到http://www.opensymphony.com/compass/download.action去下載最新的版本。2006828Compass 1.1 M1 發布,用的是Lucene2.0,現在講的就是這個版本。

          雖然有人說Hibernate3.1以后版本自帶了對Lucene的支持,Compass好像沒用,但是只要看一下Hibernate源代碼可以看出HibernateLucene的支持很簡陋,且不支持事務并且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;

              }

          }

          上面就是一個ArticlePOJO類上面有文章題目,內容,發布時間,這里的idcompass必須的(有點和數據庫一樣了)。

          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是第一個基于lucenejava開源框架");

                  article.setTitle("學習Compass");

                  article.setPublishDate(new Date());

                  comSession.save(article);

                  comTx.commit();

              }

          當大家看到這里的時候就看出來CompassHibernate太像了。如果會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是第一個基于lucenejava開源框架

          Sat Sep 23 00:51:35 CST 2006

           

          注意:和其它的框架一樣,Compass也是需要一定的配置的,而Compass的數據配置可分為Annotations,DTD驗證的XMLSchema驗證的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是什么。就會學到很多的東西

                  }

          }

          posted on 2007-12-18 11:03 方濤升 閱讀(354) 評論(0)  編輯  收藏 所屬分類: lucene

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          <2007年12月>
          2526272829301
          2345678
          9101112131415
          16171819202122
          23242526272829
          303112345

          常用鏈接

          留言簿(2)

          隨筆分類

          隨筆檔案

          文章分類

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 双城市| 托克托县| 泽州县| 铅山县| 长垣县| 沽源县| 南投县| 天等县| 察雅县| 呼伦贝尔市| 连城县| 吉安市| 襄城县| 泸州市| 龙州县| 乡城县| 囊谦县| 革吉县| 柞水县| 梁平县| 洞头县| 杭锦旗| 翁牛特旗| 宁陕县| 金堂县| 吉林省| 宣化县| 德庆县| 安新县| 新郑市| 江川县| 辽阳县| 沅江市| 青铜峡市| 浦东新区| 临沭县| 衡东县| 六枝特区| 噶尔县| 航空| 靖安县|