`
longgangbai
  • 浏览: 7339658 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Compass 實用中扩展應用

阅读更多

1  Compass中的操作
通过CompassSession我们可以进行save,delete, get,load。假如我们有两个domain Object,Author 和 Book,假如我们想要query Book的话要怎样做呢? 我们需要使用alias(这个属性定义在cmp文件中),
通过CompassQueryBuilder去构造CompassQuery, CompassQueryBuilder非常灵活,非常像Hibernate的Criteria查询。具体的sample请看 Working with objects  

CompassHits hits = session.createQueryBuilder()
  .queryString("+name:jack +familyName:london")
    .setAnalyzer("an1") // use a different analyzer
  .toQuery()
    .addSort("familyName", CompassQuery.SortPropertyType.STRING)
    .addSort("birthdate", CompassQuery.SortPropertyType.INT)
  .hits();

2.  CompassGps and CompassGpsDevice
CompassGps像是一个Service,他需要在application startup时启动服务, application shutdown停止服务,CompassGpsDevice不能独立的存在,他需要依赖CompassGps, CompassGps为CompassGpsDevice提供
Compass对象,他们一起为程序提供Index的实时更新。 Compass整合Hibernate 等等 persitance framework的代码就在CompassGpsDevice里,你需要提供不同的Device,如HibernateDevice, JDODevice。你也
可以实现自己的Device, CompassGpsDevice会把domain object的更新事件通过CompassGps去通知Compass去更新索引文件,这样就是可以实时更新index了。有兴趣的话可以看看Hibernate3GpsDevice的
registerEventsForHibernate31()方法,他给Hibernate的save,delete,update操作增加listener。当然我们可以使用aop自己去实现这块。CompassGps and CompassGpsDevice  
3.

import org.compass.core.CompassCallback;
import org.compass.core.CompassException;
import org.compass.core.CompassHit;
import org.compass.core.CompassHits;
import org.compass.core.CompassQuery;
import org.compass.core.CompassQueryBuilder;
import org.compass.core.CompassSession;
import org.compass.core.CompassTemplate;

 

 

/**
  * 搜索符合条件的记录数量
  *
  * @param keywords
  * @return
  */
 public Integer findTotal(final String keywords) {
  return (Integer) this.getCompassTemplate().execute(
    new CompassCallback<Integer>() {
     public Integer doInCompass(CompassSession session)
       throws CompassException {
      CompassHits hits = session.find(keywords);
      return hits.length();
     }
    });
 }

 /**
  * 检索所有的博客的信息 幷且排序
  *
  * @param keywords
  * @return
  */
 public List<Blog> findTotal(final String keywords,
   final SortPropertyType[] types, final String... sortFields) {
  return this.getCompassTemplate().execute(
    new CompassCallback<List<Blog>>() {
     public List<Blog> doInCompass(CompassSession session)
       throws CompassException {
      List<Blog> result = new ArrayList<Blog>();
      CompassQueryBuilder queryBuilder = session
        .queryBuilder();
      CompassQuery compassQuery = queryBuilder.queryString(
        keywords).toQuery();
      for (int i = 0; i < sortFields.length; i++) {
       compassQuery.addSort(sortFields[i], types[i]);
      }
      CompassHits hits = compassQuery.hits();
      for (CompassHit compassHit : hits) {
       result.add((Blog) compassHit.getData());
      }
      return result;
     }

    });
 }

 /**
  * 查询一定時間内的博库的信息(因爲我采用的Mysql時間保存格式YYYY-MM-dd 所以將時間转换同时将高亮显示)
  * 备注我这里索引库检索的字段仅仅为subject和context所以仅仅检索了这两个字段
  *
  * @param start
  * @param end
  * @param keywords
  * @return
  */
 public List<Blog> search(final Date start, final Date end,
   final String keywords) {

  return this.getCompassTemplate().execute(
    new CompassCallback<List<Blog>>() {

     public List<Blog> doInCompass(CompassSession session)
       throws CompassException {
      List<Blog> result = new ArrayList<Blog>();
      CompassQueryBuilder queryBuilder = session
        .queryBuilder();
      CompassQuery allpropertyQuery = queryBuilder
        .queryString(keywords).toQuery();
      CompassQuery dateRangeQuery = queryBuilder.between(
        "publishTime", DateFormatUtils.format(start,
          "YYYY-MM-dd"), DateFormatUtils.format(
          end, "YYYY-MM-dd"), true);
      CompassHits hits = queryBuilder.bool().addMust(
        dateRangeQuery).addMust(allpropertyQuery)
        .toQuery().hits();
      for (int j = 0; j < hits.getLength(); j++) {
       Blog blog = (Blog) hits.data(j);
       // 针对要检索的字段高亮显示
       String subject = null;
       hits.highlighter(j).fragment("subject");
       if (StringUtils.trim(subject).length() > 0) {
        blog.setSubject(subject);
       }
       subject = null;
       hits.highlighter(j).fragment("context");
       if (StringUtils.trim(subject).length() > 0) {
        blog.setContent(subject);
       }
      }
      return result;
     }
    });
 }

 /**
  * 采用反射使用一個實用性比較强的 查询一定時間内的博库的信息(所以將時間转换同时将高亮显示)
  * 备注我这里索引库检索的字段仅仅为subject和context所以仅仅检索了这两个字段
  *
  * @param keywords
  * @param clazz
  * @param searchFields
  * @return
  */
 public List<Object> ReflectSearch(final String keywords, final Class clazz,
   final String... searchFields) {

  return this.getCompassTemplate().execute(
    new CompassCallback<List<Object>>() {

     public List<Object> doInCompass(CompassSession session)
       throws CompassException {
      List<Object> result = new ArrayList<Object>();
      CompassQueryBuilder queryBuilder = session
        .queryBuilder();
      CompassQuery allpropertyQuery = queryBuilder
        .queryString(keywords).toQuery();
      CompassHits hits = allpropertyQuery.hits();
      for (int j = 0; j < hits.getLength(); j++) {
       Object o = hits.data(j);
       try {
        Object t = clazz.newInstance();
        BeanUtils.copyProperties(t, o);
        // 针对要检索的字段高亮显示
        String subject = null;
        for (String field : searchFields) {
         subject = hits.highlighter(j).fragment(
           field);
         Field cfield = clazz
           .getDeclaredField(field);
         if (StringUtils.trim(subject).length() > 0) {
          ReflectionUtils.setField(cfield, t,
            subject);
         }
        }
        result.add(t);
       } catch (Exception e) {
        continue;
       }
      }
      return result;
     }
    });
 }

 /**
  * 查询一定時間内的博库的信息(因爲我采用的Mysql時間保存格式YYYY-MM-dd 所以將時間转换)
  *
  * @param start
  * @param end
  * @param keywords
  * @return
  */
 public List<Blog> find(final Date start, final Date end,
   final String keywords) {

  return this.getCompassTemplate().execute(
    new CompassCallback<List<Blog>>() {

     public List<Blog> doInCompass(CompassSession session)
       throws CompassException {
      List<Blog> result = new ArrayList<Blog>();
      CompassQueryBuilder queryBuilder = session
        .queryBuilder();
      CompassQuery allpropertyQuery = queryBuilder
        .queryString(keywords).toQuery();
      CompassQuery dateRangeQuery = queryBuilder.between(
        "publishTime", DateFormatUtils.format(start,
          "YYYY-MM-dd"), DateFormatUtils.format(
          end, "YYYY-MM-dd"), true);
      CompassHits hits = queryBuilder.bool().addMust(
        dateRangeQuery).addMust(allpropertyQuery)
        .toQuery().hits();

      for (CompassHit compassHit : hits) {
       result.add((Blog) compassHit.getData());
      }
      return result;
     }
    });
 }

 /**
  * 根據特定自定查询如Blog content china
  *
  * @param field
  * @param keywords
  * @return
  */
 public List<Blog> find(final String field, final String keywords) {
  return this.getCompassTemplate().execute(
    new CompassCallback<List<Blog>>() {

     public List<Blog> doInCompass(CompassSession session)
       throws CompassException {
      List<Blog> result = new ArrayList<Blog>();
      CompassQueryBuilder queryBuilder = session
        .queryBuilder();
      CompassQuery allpropertyQuery = queryBuilder.term(
        field, keywords);
      CompassHits hits = allpropertyQuery.hits();
      for (CompassHit compassHit : hits) {
       result.add((Blog) compassHit.getData());
      }
      return result;
     }
    });
 }

 /*
  * 检索所有的博客的信息 (non-Javadoc)
  *
  * @see com.vnvtrip.search.jpa.blog.dao.IBlogSearchDAO#find(java.lang.String)
  */
 public List<Blog> find(final String keywords) {
  return this.getCompassTemplate().execute(
    new CompassCallback<List<Blog>>() {

     public List<Blog> doInCompass(CompassSession session)
       throws CompassException {
      List<Blog> result = new ArrayList<Blog>();
      CompassQueryBuilder queryBuilder = session
        .queryBuilder();
      CompassQuery allpropertyQuery = queryBuilder
        .queryString(keywords).toQuery();

      CompassHits hits = allpropertyQuery.hits();
      for (CompassHit compassHit : hits) {
       result.add((Blog) compassHit.getData());
      }
      return result;
     }
    });
 }

 

 

分享到:
评论

相关推荐

    OpenStack Days China 2016 华为Wei Shao:Compass开源项目介绍

    Compass项目对于希望通过简单、高效、可扩展的方式管理数据中心的用户来说是一个非常实用的工具。它的开源特性意味着用户可以自由地使用和改进代码,同时参与到一个活跃的社区中。随着云计算和虚拟化技术的不断发展...

    指南针Compass

    在实际应用中,"安卓人必看.txt"可能包含了关于如何在Android应用开发中集成Compass的教程或者最佳实践。虽然Compass主要用于Web开发,但考虑到跨平台的趋势,也可能有开发者尝试将其理念和方法应用到Android UI的...

    Sass和Compass设计师指南pdf+源码

    而Compass是一个基于Sass的样式框架,提供了大量实用的样式库和工具,简化了CSS开发流程。 在书中,作者详细介绍了Sass的基础知识,包括如何设置环境、创建和导入.scss文件、定义变量、使用嵌套规则以及操作列表和...

    compass源代码.zip

    在 Java Web 应用中,Compass 可以与服务器端技术如 JSP、Servlet 或者 MVC 框架(如 Spring MVC)集成,提供动态生成 CSS 的能力。通过 Compass,开发者可以在服务器端定义 CSS 规则,并在客户端浏览器中生成高效的...

    跋山涉水解析compass官方sample

    Compass作为Sass的一个重要扩展,提供了丰富的CSS框架和实用模块,如网格系统、重置样式、字体图标等,帮助开发者快速构建响应式和可复用的CSS样式。 Compass的核心概念包括: 1. **配置文件**:Compass项目通常...

    前端开源库-compass

    1. **样式框架**:Compass 提供了一套完整的 CSS 样式框架,包括按钮样式、表单元素、导航菜单等,可以快速应用到项目中,减少重复工作。 2. **网格系统**:Compass 包含了一个灵活的响应式网格系统,支持自定义列...

    sass与compass实战

    Compass不仅仅是一个框架,还包含了一系列实用的混合器、组件和其他工具,如网格系统、图像处理、色彩管理等,这些都可以极大地提高开发效率。 **主要特点:** - **内置混合器**: 提供了大量的预先定义好的混合器,...

    Sass和Compass设计师指南源代码

    《Sass和Compass设计师指南源代码》是一个深入解析Sass和Compass技术的资源集合,包含多个章节的源码示例,旨在帮助设计师更好地理解和应用这两种强大的CSS预处理器。Sass(Syntactically Awesome Style Sheets)是...

    Sass与Compass实战 随书源码

    而Compass则是一个基于Sass的框架,它提供了大量的实用工具和样式库,简化Web开发中的样式工作。 首先,Sass的核心特性包括: 1. **变量**:允许我们定义和使用变量,如颜色、字体或任何CSS值,使得在整个样式表中...

    前端开源库-gulp-compass

    将 Compass 集成到 Gulp 中,意味着开发者可以在构建过程中自动将 Sass 文件转换为标准的 CSS,同时应用 Compass 提供的样式和功能。 要使用 gulp-compass,首先确保你已经安装了 Node.js 和 npm(Node 包管理器)...

    PPC多功能指南针O2Compass v3.31 CAB汉化版

    描述中的“好用的PPC多功能指南针”表明这款应用不仅具备基本的指南针功能,还可能包含其他实用工具。提到的“含手电筒”功能,意味着O2Compass不仅仅是一个导航工具,还能在需要时作为手电筒使用,增加了软件的实用...

    [sass+compass+susy+源码实战]css设计师指南

    Compass 是一个基于 Sass 的框架,提供了大量的实用工具和样式库,如网格系统、重置样式、图标字体等,大大简化了 CSS 开发工作。 在本资源包中,"初识 sass compass框架" 部分将引导你了解如何安装和设置 Sass 和 ...

    Mouse Compass-crx插件

    例如,在Gmail或其他占用鼠标位置的网页应用中,Mouse Compass的功能可能无法正常工作,因为这些应用可能会覆盖或干扰指南针的显示。尽管目前这个问题尚未得到解决,但开发者LazyLabz表示他们正致力于在未来版本中...

    PyPI 官网下载 | django-pipeline-compass-0.1.4.tar.gz

    `django-pipeline`是Django的一个第三方扩展,它的主要功能是对应用中的CSS和JavaScript进行合并和压缩,以减少HTTP请求的数量和文件大小,从而加快页面加载速度。它还支持自动化处理SASS、LESS等预处理器的源文件,...

    在Vue中使用Compass的方法

    在实际开发中,Compass提供了诸如`border-radius`、`center`、`grid`等大量实用的混合,可以大大提高我们的开发效率。例如,我们可以使用`center`混合创建一个居中的布局: ```scss .centered { @include center; ...

    sass与compass实战--源代码

    通过下载并研究`sass-and-compass-in-action-master`这个项目,你将能掌握如何将SASS与Compass应用到实际项目中,提升CSS编码体验。实践过程中,你将遇到各种示例和应用场景,加深对这两项技术的理解,并能够自如地...

    compass:我们走吧

    Compass是一款基于Sass的框架,Sass是Syntactically Awesome Style Sheets(语法超炫样式表)的缩写,是一个用于CSS扩展的开源语言。Compass将Sass的功能进一步拓展,提供了一系列预定义的混合(mixins)、函数和...

    extensionfiles EE笔记分享

    "Lucene&Compass笔记"则专注于全文搜索引擎技术,Lucene是一个高性能、可扩展的信息检索库,而Compass是基于Lucene的一个对象关系映射(ORM)工具,它们在大数据处理和搜索应用中有着广泛应用。"项目笔记"可能涵盖了...

    ddupont:BOOTSTRAP Compass Grunt Boilerplate

    Compass提供了许多实用的样式库,如reset、grid系统、字体图标等,同时还简化了与Bootstrap的集成,让开发者能够更好地利用Bootstrap的组件,并自定义样式。 **Grunt**: Grunt是JavaScript的构建工具,用于自动化...

    MongoDB简单应用

    对于开发者来说,MongoDB还提供了丰富的编程语言驱动,如Python的PyMongo、Java的MongoDB Java Driver等,方便在各种应用中集成数据库操作。 在"工具"这个标签下,我们可能讨论到MongoDB的管理工具,如MongoDB ...

Global site tag (gtag.js) - Google Analytics