`
longgangbai
  • 浏览: 7253090 次
  • 性别: 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;
     }
    });
 }

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics