Compass是第一個實現Java搜索引擎的開源框架,它是基於Lucene之上的,提供更簡單的搜索引擎API,事務支持,對象到搜索引擎映射(Annotations & XML),XML到搜索引擎映射,可以和Hibernate,Spring集成,功能非常的強大。如果用Hibernate,Spring做的項目需要搜索引擎的話,Compass是個非常好的選擇。Compass是用面向對象編程方法來實現搜索。如果會Hibernate的話學Compass是非常容易的。
雖然有人說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:
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
\"-//Compass/Compass Core Configuration DTD 1.0//EN\"
\"http://www.opensymphony.com/compass/dtd/compass-core-configuration.dtd\">
target/test
這是Compass的配置文件上面標明了索引目錄和映射文件。映射好文件了就看看這個映射的什麼吧
3. Article.cpm.XML
\"-//Compass/Compass Core Mapping DTD 1.0//EN\"
\"http://www.opensymphony.com/compass/dtd/compass-core-mapping.dtd\">
type
Java
titleIndex
contentIndex
publishDateIndex
這個配置應該可以看的懂吧可能會有人問meta-data是干什麼用的??
它的值是作為底層Field的名字,如果沒有配置的話Compass用$article/…來代替。而它的作用是配置對象的屬性的儲存形式,Compass就是讀取它來new FIEld()的:#PCDATA)>
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(\"學習Compass\");
article.setPublishDate(new Date());
comSession.save(article);
comTx.commit();
}
當大家看到這裡的時候就看出來Compass和Hibernate太像了。如果會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是第一個基於lucene的Java開源框架
Sat Sep 23 00:51:35 CST 2006
注意:和其它的框架一樣,Compass也是需要一定的配置的,而Compass的數據配置可分為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 {
Document doc = hits.doc(i);
System.out.println(doc.get(\"contentIndex\"));
}
}
[upload=1][/upload]