OMG,到底在尋找什么..................
          (構(gòu)造一個(gè)完美的J2EE系統(tǒng)所需要的完整知識(shí)體系)
          posts - 198,  comments - 37,  trackbacks - 0

          Compass學(xué)習(xí)文檔(1)
          作者:javafish
          Compass是第一個(gè)實(shí)現(xiàn)java搜索引擎的開源框架,它是基于Lucene之上的,提供更簡(jiǎn)單的搜索引擎API,事務(wù)支持,對(duì)象到搜索引擎映射(Annotations & XML),Xml到搜索引擎映射,可以和Hibernate,Spring集成,功能非常的強(qiáng)大。如果用Hibernate,Spring做的項(xiàng)目需要搜索引擎的話,Compass是個(gè)非常好的選擇。個(gè)人認(rèn)為:如果說(shuō)Lucene是搜索引擎中的JDBC,那么Compass就是Hibernate。而Compass和Hibernate不僅僅是比喻的像,它們的類和用法,和作用也非常的像。Compass是用面向?qū)ο缶幊谭椒▉?lái)實(shí)現(xiàn)搜索。如果會(huì)Hibernate的話學(xué)Compass是非常容易的。
          大家可以到http://www.opensymphony.com/compass/download.action去下載最新的版本。2006年8月28日Compass 1.1 M1 發(fā)布,用的是Lucene2.0,現(xiàn)在講的就是這個(gè)版本。
          雖然有人說(shuō)Hibernate3.1以后版本自帶了對(duì)Lucene的支持,Compass好像沒用,但是只要看一下Hibernate源代碼可以看出Hibernate對(duì)Lucene的支持很簡(jiǎn)陋,且不支持事務(wù)并且Hibernate3.2用的還是Lucene版本是Lucene1.4.3,所以說(shuō)當(dāng)做大的項(xiàng)目的時(shí)候Compass還是非常有必要的。
          還是先看個(gè)HelloWorld程序:(這里的測(cè)試功能的例子都是用的JUnit測(cè)試用例,為方便閱讀異常全部拋出)
          一共4個(gè)文件Article.java, compass.cfg.xml,Article.cpm.xml,JUnit插入測(cè)試。
          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;
          ?}
          }
          上面就是一個(gè)Article的POJO類上面有文章題目,內(nèi)容,發(fā)布時(shí)間,這里的id的compass必須的(有點(diǎn)和數(shù)據(jù)庫(kù)一樣了)。
          2.compass.cfg.xml
          <!DOCTYPE compass-core-configuration PUBLIC
          ??? "-//Compass/Compass Core Configuration DTD 1.0//EN"
          ??? "<compass-core-configuration>
          ?<compass>
          ??<setting name="compass.engine.connection">target/test</setting><!-- 這里配置的是索引的相對(duì)路徑 -->
          ??<mapping resource="org/li/compass/Article.cpm.xml"/><!-- 這里是每個(gè)對(duì)象的映射文件 -->
          ?</compass>
          </compass-core-configuration>
          這是Compass的配置文件上面標(biāo)明了索引目錄和映射文件。映射好文件了就看看這個(gè)映射的什么吧
          3. Article.cpm.xml
          <!DOCTYPE compass-core-mapping PUBLIC
          ??? "-//Compass/Compass Core Mapping DTD 1.0//EN"
          ??? "
          <compass-core-mapping package="org.li.compass">
          ?<class name="Article" alias="article">
          ??<!-- 這是必須有的 -->
          ??<id name="id"/>
          ??<!-- 你可以通過(guò)這個(gè)配置來(lái)在底層給這個(gè)對(duì)象加一個(gè)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>
          這個(gè)配置應(yīng)該可以看的懂吧可能會(huì)有人問(wèn)meta-data是干什么用的??
          它的值是作為底層Field的名字,如果沒有配置的話Compass用$article/…來(lái)代替。而它的作用是配置對(duì)象的屬性的儲(chǔ)存形式,Compass就是讀取它來(lái)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插入測(cè)試
          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是第一個(gè)基于lucene的java開源框架");
          ??article.setTitle("學(xué)習(xí)Compass");
          ??article.setPublishDate(new Date());
          ??comSession.save(article);
          ??comTx.commit();
          ?}
          當(dāng)大家看到這里的時(shí)候就看出來(lái)Compass和Hibernate太像了。如果會(huì)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是第一個(gè)基于lucene的java開源框架
          Sat Sep 23 00:51:35 CST 2006

          注意:和其它的框架一樣,Compass也是需要一定的配置的,而Compass的數(shù)據(jù)配置可分為Annotations,DTD驗(yàn)證的XML和Schema驗(yàn)證的XML。這里用的是dtd驗(yàn)證的XML配置。
          我們可以用Lucene做一下檢測(cè)嘛
          JUnit測(cè)試用例:
          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è)置個(gè)斷點(diǎn)看一下doc里各個(gè)Field是什么。就會(huì)學(xué)到很多的東西
          ??}
          }


          <2006年11月>
          2930311234
          567891011
          12131415161718
          19202122232425
          262728293012
          3456789

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          IT風(fēng)云人物

          文檔

          朋友

          相冊(cè)

          經(jīng)典網(wǎng)站

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 普兰店市| 英山县| 常熟市| 新巴尔虎右旗| 桂东县| 靖江市| 延川县| 醴陵市| 隆德县| 呼玛县| 墨竹工卡县| 通化市| 广灵县| 东城区| 乌恰县| 突泉县| 宽甸| 三原县| 谷城县| 西乌珠穆沁旗| 敖汉旗| 哈巴河县| 耿马| 莱芜市| 隆尧县| 双流县| 阿拉善盟| 安塞县| 彭泽县| 吉木乃县| 东至县| 和平县| 新闻| 霍林郭勒市| 大理市| 临夏县| 彭水| 高邑县| 清河县| 张家川| 神木县|