posts - 33,  comments - 11,  trackbacks - 0
           

          Compass是第一個實現(xiàn)java搜索引擎的開源框架,它是基于Lucene之上的,提供更簡單的搜索引擎API,事務(wù)支持,對象到搜索引擎映射(Annotations & XML),Xml到搜索引擎映射,可以和Hibernate,Spring集成,功能非常的強大。如果用Hibernate,Spring做的項目需要搜索引擎的話,Compass是個非常好的選擇。個人認為:如果說Lucene是搜索引擎中的JDBC,那么Compass就是HibernateCompassHibernate不僅僅是比喻的像,它們的類和用法,和作用也非常的像。Compass是用面向?qū)ο缶幊谭椒▉韺崿F(xiàn)搜索。如果會Hibernate的話學(xué)Compass是非常容易的。

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

          雖然有人說Hibernate3.1以后版本自帶了對Lucene的支持,Compass好像沒用,但是只要看一下Hibernate源代碼可以看出HibernateLucene的支持很簡陋,且不支持事務(wù)并且Hibernate3.2用的還是Lucene版本是Lucene1.4.3,所以說當做大的項目的時候Compass還是非常有必要的。

          還是先看個HelloWorld程序:(這里的測試功能的例子都是用的JUnit測試用例,為方便閱讀異常全部拋出)

          一共4個文件Article.java compass.cfg.xmlArticle.cpm.xmlJUnit插入測試。

          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類上面有文章題目,內(nèi)容,發(fā)布時間,這里的idcompass必須的(有點和數(shù)據(jù)庫一樣了)。

          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>

          這個配置應(yīng)該可以看的懂吧可能會有人問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("學(xué)習(xí)Compass");

                  article.setPublishDate(new Date());

                  comSession.save(article);

                  comTx.commit();

              }

          當大家看到這里的時候就看出來CompassHibernate太像了。如果會Hibernate的話,學(xué)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());

              }

          結(jié)果:

          學(xué)習(xí)Compass

          Compass是第一個基于lucenejava開源框架

          Sat Sep 23 00:51:35 CST 2006

           

          注意:和其它的框架一樣,Compass也是需要一定的配置的,而Compass的數(shù)據(jù)配置可分為AnnotationsDTD驗證的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"));//大家可以在這里設(shè)置個斷點看一下doc里各個Field是什么。就會學(xué)到很多的東西

                  }

          }

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

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


          網(wǎng)站導(dǎo)航:
           
          <2007年12月>
          2526272829301
          2345678
          9101112131415
          16171819202122
          23242526272829
          303112345

          常用鏈接

          留言簿(2)

          隨筆分類

          隨筆檔案

          文章分類

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 遂川县| 泉州市| 涡阳县| 宁蒗| 金坛市| 封开县| 深泽县| 神农架林区| 临洮县| 连山| 平顶山市| 克东县| 锡林浩特市| 西充县| 同德县| 和政县| 齐河县| 长乐市| 科技| 皮山县| 宁远县| 诸城市| 宁城县| 黎平县| 临朐县| 庆城县| 海伦市| 蓬安县| 娱乐| 宣城市| 龙里县| 镇宁| 辽源市| 上杭县| 三台县| 岚皋县| 新源县| 永平县| 巴青县| 肇庆市| 浦江县|