`
3Seefans
  • 浏览: 21714 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
社区版块
存档分类
最新评论

compass读书笔记

阅读更多
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学习笔记

    Compass概念: 1:Compass相当于hb的SessionFactory 2:CompassSession相当于hb的Session 3:CompassTransaction相当于hb的transaction。 &lt;br&gt;Compass也是采用CompassConfiguration(装载配置和映射文件...

    Compass原理深入学习笔记

    【Compass原理深入学习笔记】 Compass是一款基于Apache Lucene的全文搜索引擎框架,它为开发者提供了更高级别的抽象层,简化了搜索引擎的集成工作。在理解Compass之前,我们需要先了解全文检索的基本概念和原理。 ...

    compass 笔记

    ### Compass 核心知识点概述 #### 一、CompassCore:构建坚实的基础 **CompassCore** 是 **Compass** 的基石,它基于 **Lucene** 进行了一系列的增强和扩展,旨在提供更为丰富的功能和支持。具体来说,CompassCore...

    compass完整可用项目

    【compass完整可用项目】是一个基于特定技术栈的软件开发项目,该项目的核心是Compass库,一个与Lucene紧密集成的全文搜索引擎工具。Compass提供了一种简单的方式来在Java应用程序中集成全文搜索功能,使得开发者...

    完整compass工程+建库sql+学习资料

    `compass学习笔记.doc`是一份关于Compass的学习文档,可能包含了使用Compass的基本步骤,常见问题解答,以及一些最佳实践。这份文档对于理解Compass的工作原理和实际应用是非常有价值的。 `lucene总结.chm`和`...

    mongodb安装包和compass

    Compass是MongoDB的官方图形界面工具,它提供了一个用户友好的界面,用于可视化数据库和集合,帮助开发者和管理员进行数据探索、查询构建、性能分析以及基本的数据库管理。通过Compass,用户可以轻松地浏览和操作...

    Compass_入门指南

    Compass 入门指南 Compass 是一个搜索引擎框架,旨在提供高效、可扩展的搜索解决方案。以下是 Compass 入门指南,涵盖了 Compass 的核心概念、配置文件、注解方式、核心 API、与 Spring 集成等方面。 Compass 的...

    compass搜索引擎技术

    Compass搜索引擎技术是一种基于Lucene的全文检索框架,它提供了更高级别的API和集成机制,使得在Java应用程序中实现搜索引擎功能变得更加便捷。Compass的主要目标是将全文索引能力无缝地融入到现有的业务应用程序中...

    compass教程.pdf

    COMPASS 教程Pdf COMPASS 是一款专业的油气田设计和生产软件,主要用于油气田的规划、设计和生产过程。下面是 COMPASS 的一些重要知识点: 1. COMPASS WELLPLAN FOR WINDOWS 功能简介:COMPASS 的核心功能包括 ...

    compass_使用详解.pdf compass_教程 compass_试用案例

    ### Compass 使用详解 #### 一、Compass 概述 Compass 是一款开源的 Java 库,用于简化 Lucene 的使用。它通过提供类似于 Hibernate 的对象关系映射(ORM)功能,使得开发者能够更加轻松地将 Java 对象映射到 ...

    java搜索 compass资料

    ### Java搜索 Compass 资料知识点 #### 一、Compass 概述 Compass 是一个为 Java 应用程序提供全文检索功能的框架。它能够帮助开发者在 Java 应用程序中轻松实现复杂的搜索需求,并且具有较高的性能。Compass 基于...

    mongodb compass1.15.1官网版 免安装直接使用

    MongoDB Compass是MongoDB官方提供的一款图形化管理工具,它为MongoDB数据库的使用者提供了直观的界面,方便进行数据浏览、查询、操作以及性能分析。MongoDB Compass 1.15.1是这个系列的一个版本,它无需安装,可以...

    Compass 的java代码

    **Compass:Lucene的高级封装工具** Compass是一款基于Apache Lucene的全文搜索引擎库,它为Java开发者提供了一个高级的、易于使用的搜索框架。在Java应用中集成搜索引擎功能时,Compass提供了一种简化的方式来管理...

    compass annotation关联关系

    Compass 是一个全文搜索引擎库,它是对 Lucene 的封装,为 Java 应用提供了一种简单易用的接口。在 Compass 中,Annotation 是一种元数据注解方式,它允许开发者在对象模型上直接定义搜索映射,使得对象与索引之间的...

    mongodb-compass-1.17.0-win32-x64 MongoDB可视化工具Compass

    MongoDB Compass是MongoDB公司开发的一款强大的图形化管理工具,专为MongoDB数据库设计,用于帮助用户更加直观地理解和操作NoSQL数据库。本压缩包文件"mongodb-compass-1.17.0-win32-x64"包含了适用于Windows 32位和...

    Compass全文检索系列之一:Compass入门

    Compass全文检索系列之一:Compass入门 在IT领域,全文检索已经成为数据分析和信息检索的重要技术,尤其是在大数据时代。本文将介绍Compass,一个基于Lucene的全文搜索引擎库,为Java开发者提供了一种简单易用的...

    compass的几个入门网页

    Compass是一个基于Sass的CSS预处理器框架,它极大地扩展了CSS的功能,使得开发者能够更加高效、优雅地编写样式表。下面将详细讲解Compass的基本概念、安装过程、主要功能以及如何通过它来构建入门级的网页项目。 一...

    基于Luncene的compass框架详解-java

    基于Lucene的Compass框架详解-Java 一、Compass框架概述 Compass是一个高性能的开源Java搜索引擎框架,旨在简化应用程序与搜索引擎之间的集成过程。它不仅利用了顶级的Lucene搜索引擎的强大功能,还融合了诸如...

Global site tag (gtag.js) - Google Analytics