环境 lucene2.4 + compass2.2
1. xml 配置
a. compass.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<compass-core-config
xmlns="http://www.compass-project.org/schema/core-config"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.compass-project.org/schema/core-config
http://www.compass-project.org/schema/compass-core-config-2.2.xsd">
<compass name="default">
<!-- 连接信息 -->
<connection>
<file path="./index/" />
</connection>
<!-- 声明映射信息 -->
<mappings>
<class name="com.tieba.hibernate.domain.Article" />
</mappings>
<!-- 其他配置 -->
<settings>
<!-- 配置分词器, 指定所用的分词器的全限定类名 -->
<setting name="compass.engine.analyzer.default.type" value="jeasy.analysis.MMAnalyzer" />
<!-- 指定摘要的文本长度 -->
<setting name="compass.engine.highlighter.default.fragmenter.simple.size" value="50" />
<!-- 配置高亮效果的前缀 -->
<setting name="compass.engine.highlighter.default.formatter.simple.pre" value="<span style='color:red'>" />
<!-- 配置高亮效果的后缀 -->
<setting name="compass.engine.highlighter.default.formatter.simple.post" value="</span>" />
</settings>
</compass>
</compass-core-config>
b. CRUD操作
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 com.tieba.hibernate.domain.Article;
public class ArticleIndexDao {
private Compass compassSessionFactory;
public ArticleIndexDao(){
/* 1. 编程的方式
CompassConfiguration cfg = new CompassConfiguration();
cfg.setConnection("./index");// 连接信息
cfg.addClass(Article.class);// 声明映射信息
// cfg.setSetting("key", "value");//其他配置
// 配置分词器 // 指定所用的分词器的全限定类名
cfg.setSetting("compass.engine.analyzer.default.type", "jeasy.analysis.MMAnalyzer");
// 指定摘要的文本长度
cfg.setSetting("compass.engine.highlighter.default.fragmenter.simple.size", "50");
// 配置高亮效果的前缀
cfg.setSetting("compass.engine.highlighter.default.formatter.simple.pre", "<span style='color: red'>");
// 配置高亮效果的后缀
cfg.setSetting("compass.engine.highlighter.default.formatter.simple.post", "</span>");
compassSessionFactory = cfg.buildCompass();*/
// 2. xml配置文件方式
CompassConfiguration cfg = new CompassConfiguration().configure();
compassSessionFactory = cfg.buildCompass();
}
/**
* 保存索引
* @param article 文章
*/
public void save(Article article){
// 得到CompassSession
CompassSession session = compassSessionFactory.openSession();
CompassTransaction tx = null;
try {
tx = session.beginTransaction();
session.save(article);
tx.commit();
} catch (Exception e) {
if (tx != null) {
tx.rollback();
}
} finally {
session.close();
}
}
/**
* 删除索引
* @param id
*/
public void delete(Long id){
CompassSession session = compassSessionFactory.openSession();
CompassTransaction tx = null;
try {
tx = session.beginTransaction();
session.delete(Article.class, id);
tx.commit();
} catch (Exception e) {
if (tx != null) {
tx.rollback();
}
e.printStackTrace();
} finally {
session.close();
}
}
/**
* 搜索
* @param quertyString 关键词
* @return
*/
public List<Article> find(String quertyString){
CompassSession session = compassSessionFactory.openSession();
CompassTransaction tx = null;
CompassHits hits = null;
List<Article> list = new ArrayList<Article>();
try {
tx = session.beginTransaction();
hits = session.find(quertyString);
for (int i = 0; i < hits.length(); i++) {
Article article = (Article) hits.data(i);
// ====================================== 使用高亮器
// 如果在高亮的属性值中没有出现关键词,就返回null
String title = hits.highlighter(i).fragment("title");
String content = hits.highlighter(i).fragment("content");
if (title != null) {
article.setTitle(title);
}
if (content != null) {
article.setContent(content);
}
list.add(article);
}
tx.commit();
} catch (Exception e) {
e.printStackTrace();
} finally {
session.close();
}
return list;
}
}