Compass是第一個實現(xiàn)java搜索引擎的開源框架,它是基于Lucene之上的,提供更簡單的搜索引擎API,事務(wù)支持,對象到搜索引擎映射(Annotations & XML),Xml到搜索引擎映射,可以和Hibernate,Spring集成,功能非常的強大。如果用Hibernate,Spring做的項目需要搜索引擎的話,Compass是個非常好的選擇。個人認(rèn)為:如果說Lucene是搜索引擎中的JDBC,那么Compass就是Hibernate。而Compass和Hibernate不僅僅是比喻的像,它們的類和用法,和作用也非常的像。Compass是用面向?qū)ο缶幊谭椒▉韺崿F(xiàn)搜索。如果會Hibernate的話學(xué)Compass是非常容易的。
大家可以到http://www.opensymphony.com/compass/download.action去下載最新的版本。2006年8月28日Compass 1.1 M1 發(fā)布,用的是Lucene2.0,現(xiàn)在講的就是這個版本。
雖然有人說Hibernate3.1以后版本自帶了對Lucene的支持,Compass好像沒用,但是只要看一下Hibernate源代碼可以看出Hibernate對Lucene的支持很簡陋,且不支持事務(wù)并且Hibernate3.2用的還是Lucene版本是Lucene1.4.3,所以說當(dāng)做大的項目的時候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;
}
}
上面就是一個Article的POJO類上面有文章題目,內(nèi)容,發(fā)布時間,這里的id的compass必須的(有點和數(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的配置文件上面標(biāo)明了索引目錄和映射文件。映射好文件了就看看這個映射的什么吧
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是第一個基于lucene的java開源框架");
article.setTitle("學(xué)習(xí)Compass");
article.setPublishDate(new Date());
comSession.save(article);
comTx.commit();
}
當(dāng)大家看到這里的時候就看出來Compass和Hibernate太像了。如果會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是第一個基于lucene的java開源框架
Sat Sep 23 00:51:35 CST 2006
注意:和其它的框架一樣,Compass也是需要一定的配置的,而Compass的數(shù)據(jù)配置可分為Annotations,DTD驗證的XML和Schema驗證的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
方濤升 閱讀(352)
評論(0) 編輯 收藏 所屬分類:
lucene