Compass是一个强大的,事务的,高性能的对象/搜索引擎映射(OSEM:object/search engine mapping)与一个Java持久层框架。
Compass之于Lucene,就像Hibernate之于JDBC,Compass就是把Lucene封装了一层。
Compass目前版本是2.2.0,已经很久没有更新与维护。Compass2.2的版本所对应的Lucene2.4.1。
下载地址:http://www.compass-project.org/
解压后的目录结构:
开发的基本jar包在dist及其子目录下查找,主要如下,
代码示例:
Article.java
package com.my.bean;
import org.compass.annotations.Index;
import org.compass.annotations.Searchable;
import org.compass.annotations.SearchableBoostProperty;
import org.compass.annotations.SearchableId;
import org.compass.annotations.SearchableProperty;
import org.compass.annotations.Store;
@Searchable
public class Article {
// 对于@SearchableId,默认是不可以进行查询的,在指定了name参数后,就可以使用这个属性查询了
// 对于数字的属性,可以指定format为若干个0,表示要存成几个长度,如果不足这个长度,前面用'0'补齐
@SearchableId(name = "id", format = "00000000")
private Integer id;
@SearchableProperty(name = "title", store = Store.YES, index = Index.ANALYZED)
private String title;
@SearchableProperty(name = "content", store = Store.YES, index = Index.ANALYZED)
private String content;
@SearchableBoostProperty
private float boostValue = 1F;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public float getBoostValue() {
return boostValue;
}
public void setBoostValue(float boostValue) {
this.boostValue = boostValue;
}
}
HelloWorld.java
package com.my.compass;
import java.util.ArrayList;
import java.util.List;
import org.compass.core.Compass;
import org.compass.core.CompassHits;
import org.compass.core.CompassSession;
import org.compass.core.CompassTransaction;
import org.compass.core.config.CompassConfiguration;
import org.junit.Test;
import com.my.bean.Article;
public class HelloWorld {
private CompassConfiguration cfg = new CompassConfiguration().configure();
private Compass compassSessionFactory = cfg.buildCompass();
// 建立索引(模拟在贴吧中发表了一个文章,会保存到数据库中,并且应该建立索引,以便能搜索到)
@Test
public void createIndex() throws Exception {
// 模拟一条刚保存到数据库中的数据
Article article = new Article();
article.setId(1);
article.setTitle("Lucene是全文检索的框架");
article.setContent("如果信息检索系统在用户发出了检索请求后再去互联网上找答案,根本无法在有限的时间内返回结果。");
// 建立索引 ?
CompassSession session = compassSessionFactory.openSession();
CompassTransaction tx = session.beginTransaction();
session.create(article); // 创建索引
tx.commit();
session.close();
}
// 搜索
@Test
public void search() throws Exception {
// 搜索条件
// String queryString = "lucene";
String queryString = "compass";
// 进行搜索,得到结果 ?
List<Article> list = new ArrayList<Article>();
CompassSession session = compassSessionFactory.openSession();
CompassTransaction tx = session.beginTransaction();
CompassHits hits = session.find(queryString);
// int count = hits.length(); // 总结果数
for (int i = 0; i < hits.length(); i++) {
Article article = (Article) hits.data(i);
// hits.score(i);
list.add(article);
}
tx.comm