程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 基於Java的搜索引擎:Compass

基於Java的搜索引擎:Compass

編輯:關於JAVA

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]

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved