Compass是基于lucene的一个全文搜索框架,我们可以把她看成是封装了lucene的ORM框架。
compass好比hibernate封装了jdbc一样封装了lucene。它可以自动完成实体对象到lucene提供的Document对象的转换,同时Compass隐藏了lucene复杂的多线程模型,避免了索引的同步问题。
类似hibernate,compass提供了Compass,CompassSession,CompassTransaction等对象,其中Compass类似hibernate的SessionFactory,负责拿到CompassSession,而CompassSession提供了create()和delete()方法用于创建和删除索引,find()方法用于实现全文搜索,同时CompassTransaction对其提供事务支持。
compass在项目中的使用:
1.实现对象到Document的映射,利用java 5注释,很容易做到。在对象中已get开头的属性中添加Compass注释@SearchableProperty。
@SearchableProperty包括四个属性:index,sotre,converter,boost。
index表示是否索引改属性。
sotre是否存储该属性。
converter是如何实现属性和string之间的转换。注意,lucene的属性都是string,如果非String类型,则需要手动指定一个转换器。
boost则是指定给属性在索引中的重要性。
注意,对于用于标志实体的唯一标志属性要用@SearchableId标志。
2.定义和编写相关的searchService接口和相关的实现类,定义相关的创建,删除,更新和搜索等方法。
这里可以看下livebookstore中的searcheService的实现:
public class SearchServiceImpl implements SearchService {
private final Log log = LogFactory.getLog(getClass());
private String directory;
private Compass compass;
/**
* 设置索引的存储目录
* @spring.property value="/WEB-INF/compass"
*/
public void setIndexDirectory(Resource resouce) {
try {
File dir = resouce.getFile();
if (!dir.isDirectory()) {
if (!dir.mkdirs()) {
throw new ExceptionInInitializerError("Could not create directory for compass: " + dir.getPath());
}
}
directory = dir.getPath();
log.info("Set compass directory: " + directory);
} catch (IOException e) {
throw new ExceptionInInitializerError(e);
}
}
/**
* 初始化Copass
*/
public void init() {
DateConverter dateConverter = new DateConverter();
dateConverter.setFormat("yyyy-MM-dd");
compass = new CompassAnnotationsConfiguration().setConnection(directory).addClass(Book.class)
.registerConverter("date", dateConverter).buildCompass();
}
/**
* Destroy compass.
*/
public void destroy() {
compass.close();
}
public void index(Book book) {
log.info("Index book...");
CompassSession session = null;
CompassTransaction tx = null;
try {
session = compass.openSession();
tx = session.beginTransaction();
session.create(book);
tx.commit();
log.info("Done.");
} catch (RuntimeException e) {
tx.rollback();
throw e;
} finally {
if (session != null)
session.close();
}
}
public void unindex(Book book) {
log.info("Unindex book...");
CompassSession session = null;
CompassTransaction tx = null;
try {
session = compass.openSession();
tx = session.beginTransaction();
session.delete(book);
tx.commit();
log.info("Done.");
} catch (RuntimeException e) {
tx.rollback();
throw e;
} finally {
if (session != null)
session.close();
}
}
public void reindex(Book book) {
log.info("Reindex book...");
CompassSession session = null;
CompassTransaction tx = null;
try {
session = compass.openSession();
tx = session.beginTransaction();
session.delete(book);
session.create(book);
tx.commit();
log.info("Done.");
} catch (RuntimeException e) {
tx.rollback();
throw e;
} finally {
if (session != null)
session.close();
}
}
@SuppressWarnings("unchecked")
public List<Book> search(String q, Page page) {
if (q == null)
return Collections.EMPTY_LIST;
q = q.trim();
if ("".equals(q))
return Collections.EMPTY_LIST;
CompassSession session = null;
CompassTransaction tx = null;
try {
session = compass.openSession();
tx = session.beginTransaction();
CompassHits hits = session.find(q);
int count = hits.length();
page.setTotalCount(count);
if (count == 0) {
tx.commit();
return Collections.EMPTY_LIST;
}
// fetch hits[start, end):
int start = page.getFirstResult();
int end = start + page.getPageSize();
if (end > count)
end = count;
List<Book> results = new ArrayList<Book>(end - start);
for (int i = start; i < end; i++) {
results.add((Book) hits.data(i));
}
tx.commit();
return results;
} catch (RuntimeException e) {
tx.rollback();
throw e;
} finally {
if (session != null)
session.close();
}
}
}
从上面可以看出,实现一个Compass 是很容易的。
当对象的创建,删除和更新会影响到索引的变化。这里我们就需要在对象的创建,删除和更新的方法中相应的更新索引,也就是调用service的相应创建,删除和更新方法既可以。
3.如果涉及到服务器迁移,或者数据库的改动,修要从新为所有的书籍重建索引。我们只需要得到相关的全部实体,执行其创建方法就可以了。
分享到:
相关推荐
Compass概念: 1:Compass相当于hb的SessionFactory 2:CompassSession相当于hb的Session 3:CompassTransaction相当于hb的transaction。 <br>Compass也是采用CompassConfiguration(装载配置和映射文件...
【Compass原理深入学习笔记】 Compass是一款基于Apache Lucene的全文搜索引擎框架,它为开发者提供了更高级别的抽象层,简化了搜索引擎的集成工作。在理解Compass之前,我们需要先了解全文检索的基本概念和原理。 ...
### Compass 核心知识点概述 #### 一、CompassCore:构建坚实的基础 **CompassCore** 是 **Compass** 的基石,它基于 **Lucene** 进行了一系列的增强和扩展,旨在提供更为丰富的功能和支持。具体来说,CompassCore...
【compass完整可用项目】是一个基于特定技术栈的软件开发项目,该项目的核心是Compass库,一个与Lucene紧密集成的全文搜索引擎工具。Compass提供了一种简单的方式来在Java应用程序中集成全文搜索功能,使得开发者...
`compass学习笔记.doc`是一份关于Compass的学习文档,可能包含了使用Compass的基本步骤,常见问题解答,以及一些最佳实践。这份文档对于理解Compass的工作原理和实际应用是非常有价值的。 `lucene总结.chm`和`...
Compass是MongoDB的官方图形界面工具,它提供了一个用户友好的界面,用于可视化数据库和集合,帮助开发者和管理员进行数据探索、查询构建、性能分析以及基本的数据库管理。通过Compass,用户可以轻松地浏览和操作...
Compass 入门指南 Compass 是一个搜索引擎框架,旨在提供高效、可扩展的搜索解决方案。以下是 Compass 入门指南,涵盖了 Compass 的核心概念、配置文件、注解方式、核心 API、与 Spring 集成等方面。 Compass 的...
Compass搜索引擎技术是一种基于Lucene的全文检索框架,它提供了更高级别的API和集成机制,使得在Java应用程序中实现搜索引擎功能变得更加便捷。Compass的主要目标是将全文索引能力无缝地融入到现有的业务应用程序中...
COMPASS 教程Pdf COMPASS 是一款专业的油气田设计和生产软件,主要用于油气田的规划、设计和生产过程。下面是 COMPASS 的一些重要知识点: 1. COMPASS WELLPLAN FOR WINDOWS 功能简介:COMPASS 的核心功能包括 ...
### Compass 使用详解 #### 一、Compass 概述 Compass 是一款开源的 Java 库,用于简化 Lucene 的使用。它通过提供类似于 Hibernate 的对象关系映射(ORM)功能,使得开发者能够更加轻松地将 Java 对象映射到 ...
### Java搜索 Compass 资料知识点 #### 一、Compass 概述 Compass 是一个为 Java 应用程序提供全文检索功能的框架。它能够帮助开发者在 Java 应用程序中轻松实现复杂的搜索需求,并且具有较高的性能。Compass 基于...
MongoDB Compass是MongoDB官方提供的一款图形化管理工具,它为MongoDB数据库的使用者提供了直观的界面,方便进行数据浏览、查询、操作以及性能分析。MongoDB Compass 1.15.1是这个系列的一个版本,它无需安装,可以...
**Compass:Lucene的高级封装工具** Compass是一款基于Apache Lucene的全文搜索引擎库,它为Java开发者提供了一个高级的、易于使用的搜索框架。在Java应用中集成搜索引擎功能时,Compass提供了一种简化的方式来管理...
Compass 是一个全文搜索引擎库,它是对 Lucene 的封装,为 Java 应用提供了一种简单易用的接口。在 Compass 中,Annotation 是一种元数据注解方式,它允许开发者在对象模型上直接定义搜索映射,使得对象与索引之间的...
MongoDB Compass是MongoDB公司开发的一款强大的图形化管理工具,专为MongoDB数据库设计,用于帮助用户更加直观地理解和操作NoSQL数据库。本压缩包文件"mongodb-compass-1.17.0-win32-x64"包含了适用于Windows 32位和...
Compass全文检索系列之一:Compass入门 在IT领域,全文检索已经成为数据分析和信息检索的重要技术,尤其是在大数据时代。本文将介绍Compass,一个基于Lucene的全文搜索引擎库,为Java开发者提供了一种简单易用的...
Compass是一个基于Sass的CSS预处理器框架,它极大地扩展了CSS的功能,使得开发者能够更加高效、优雅地编写样式表。下面将详细讲解Compass的基本概念、安装过程、主要功能以及如何通过它来构建入门级的网页项目。 一...
基于Lucene的Compass框架详解-Java 一、Compass框架概述 Compass是一个高性能的开源Java搜索引擎框架,旨在简化应用程序与搜索引擎之间的集成过程。它不仅利用了顶级的Lucene搜索引擎的强大功能,还融合了诸如...