`
yufenfei
  • 浏览: 801041 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Compass基础知识一

 
阅读更多

1Compass简单介绍

Compass是一个强大的,事务的,高性能的对象/搜索引擎映射(OSEM:object/search engine mapping)与一个Java持久层框架。

  Compass包括以下功能

          * 搜索引擎抽象层(使用Lucene搜索引荐),

          * OSEM (Object/Search Engine Mapping) 支持,

          * 事务管理,

          * 类似于Google的简单关键字查询语言,

          * 可扩展与模块化的框架,

          * 简单的API.

2Compass的优点与缺点

   优点:

      * CompassluceneSpringHibernate三者的起来,以很低很低的成本快速实现企业应用中的搜索功能;

      * Compass比较成熟,网上的文档很多,入门很简单;

      * 更多优点

   缺点:

       * Compass目前版本是2.2.0,已经很久没有更新与维护。Compass2.2的版本所对应的Lucene2.4.1,但现在Lucene已经升级到3以上的版本,Lucene3以上的版本的API差别很大,3.0以后版本貌似效率更高

      *  说这么多最终目的是说Compass目前只支持到Lucene2.4.1版本,如果你想使用Lucene就不能使用Compass

      *  现在已经有Hibernate Search作为搜索引擎框架,可以与Lucene进行联合使用。但我没有真正的去使用过。

         

3Compass

       Compass 通过OSEM(Object/Search Engine Mapping)允许把应用对象的领域模型映射到搜索引擎,目前有两种方式来进行OSEM,分别是XML方式和JDK5以上的注解(Annotation

   方式。

      与采用xml配置文件相比较,采用Annonation方式还是相对简单。使用注解方式核心标注只有@Searchable@SearchableId@SearchableProperty @SearchableComponent个,很容易记忆,

   不想XML那么麻烦,尤其是和springhiberante一起使用时,建议采用注解方式。

  

   1)、注解详细信息

       @Searchable@SearchableId@SearchableProperty @SearchableComponent分别代表搜索类、主键、可搜索的属性与关联的、另一个可搜索的对象

      (注:Compass要求POJO要有默认构造函数,要实现equals()hashcode():   

  

      a)、@Searchable

             如:

              @Searchable

              public class Article {

             

      b)、@SearchableId

         如:

            @SearchableId

             private String id;

                           

    也可以这样写

               @SearchableId

                public Integer getId() {

                       return this.id;

                 }

                                                    

      c)、@SearchableProperty

            @SearchableProperty(name="name", store=Store.NA)

              private String name;

                                                       

             也可以放在该属性的getter方法的前

                  @SearchableProperty注解有几个属性需要注意:

                      

                  store

                        Store.NA,默认值,等同Store.YES

                         Store.NO Lucene中的Field.Store.NO;指定不存储域值

                         Store.YES  Lucene中的Field.Store.YES;指定存储域值

                         Store.COMPRESS                                         

                   index:         

                              Index.NA:

                              Index.NO:使对应的域值不进行搜索

                               INDEX.ANALYZED:对域进行索引,并将域值分解成对应的词汇单元,并使每个词汇单元能被搜索

                              INDEX.NOT_ANALYZED:对域进行索引,但不对string值进行分析

                      boost:域的加权

                                                 

                       其它的可以仔细了解


   

2)、Compass核心API

 

Compass的核心API借鉴了Hibernate的术语,因此在操作上基本上与Hibernate类似,以下为Compass的几个核心接口:

 

    CompassConfiguration(类似Hibernate Configuration):用来在一些设置参数、配置文件和映射定义上配置Compass。通常用来创建Compass接口。

    Compass(类似Hibernate SessionFactory):为单线程使用,创建线程安全的实例来打开Compass Seesion。同样还提供了一些搜索引擎索引级别的操作。

    CompassSesssion(类似Hibernate Session):用来执行像保存、删除、查找、装载这样的搜索操作。很轻量但是并不是线程安全的。

    CompassTransaction(类似Hibernate Transaction):管理Compass事务的接口。使用它并不需要事务管理环境(像SpringJTA)。

 


   Compass和Hibernate很相像,无非就是HibernateJDBC封装了一把.所以从结构上来说,只要我们了解了Hibernate,就已经对Compass有了了解.那么Hibernate需要提供API和配置文件来对JDBC进行操作,那么Compass?Compass不仅从结构上模仿了Hibernate,就连API风格也不尽相同.我们把它和HibernateAPI做个对比就知道了:

再把两个session的核心方法比较一下:

Hibernate session API

CompassSession API

 

save(Object)

create(Object)

建立索引

saveOrUpdate(Object)

save(Object)

保存或更新

delete(Object)

delete(Class, ids...)

删除索引

get()

get()

获取

createQuery(hql).list()

find(String)

使用查询字符串查询

所以说,CompassHibernate极为相似,Compass总结起来就两句话:

 

4CompassLuceneSpringHibernate集成

  可以不为compass编写一行代码或者很少的代码,就可以做完搜索引擎的检索

 

 

使用Lucene2.4.1Compass2.2.0

 

 

<!-- 使用annotation配置,指定要转换的POJO。PO类在compass的classMappings值指定 -->
    <bean id="annotationConfiguration"
        class="org.compass.annotations.config.CompassAnnotationsConfiguration">
    </bean>
   
   <bean id="compass" class="org.compass.spring.LocalCompassBean">
        <!-- OSEM映射的对象PO类 -->
        <property name="classMappings">
            <list>
               <value>com.core.persistence.po.Article</value>
               <value>com.core.persistence.po.Author</value>
            </list>
        </property>
        <!-- 使用注解配置 -->
        <property name="compassConfiguration" ref="annotationConfiguration"/>
        <property name="compassSettings">
            <props>
                <!-- 索引文件在服务器上的存储路径 如:file://d:/index -->
                <prop key="compass.engine.connection">/lucene/indexes</prop>
                <!-- 在内存中建立索引
               <prop key="compass.engine.connection">ram://index</prop>
               -->
                <prop key="compass.transaction.factory">
                    org.compass.spring.transaction.SpringSyncTransactionFactory
                 </prop>
                 <!-- 配置高亮为红色 -->
                <prop key="compass.engine.highlighter.default.formatter.simple.pre">
                    <![CDATA[<font color="red"><b>]]>
                </prop>
                <prop
                    key="compass.engine.highlighter.default.formatter.simple.post">
                    <![CDATA[</b></font>]]>
                </prop>
            </props>
        </property>
 
        <property name="transactionManager" ref="transactionManager"/>
    </bean>
   
    <bean id="compassTemplate" class="org.compass.core.CompassTemplate">
        <property name="compass" ref="compass"/>
    </bean>
   
    <!-- 与hibernate的绑定,经Hiberante的数据改变会自动被反射到索引里面(增加、修改、删除操作). -->
   <bean id="hibernateGpsDevice"
        class="org.compass.gps.device.hibernate.HibernateGpsDevice">
        <property name="name">
            <value>hibernateDevice</value>
        </property>
        <property name="sessionFactory" ref="sessionFactory"/>
        <property name="mirrorDataChanges">
            <value>true</value>
        </property>
    </bean>
   
    <bean id="compassGps" class="org.compass.gps.impl.SingleCompassGps"
        init-method="start" destroy-method="stop">
        <property name="compass" ref="compass"/>
        <property name="gpsDevices">
            <list>
              <ref local="hibernateGpsDevice"/>  
            </list>
        </property>
    </bean>
 
    <!-- 定时重建索引(利用quartz)或随Spring ApplicationContext启动而重建索引 -->
    <bean id="compassIndexBuilder" class="com.lucene.service.CompassIndexBuilder" lazy-init="false">
        <property name="compassGps" ref="compassGps"/>
        <property name="buildIndex" value="true"/>
        <property name="lazyTime" value="10"/>
    </bean>
 

 
public class CompassIndexBuilder implements InitializingBean {
 
    private static final Logger log = Logger.getLogger(CompassIndexBuilder.class);
 
    // 是否需要建立索引,可被设置为false使本Builder失效.
    private boolean buildIndex = true;
 
    // 索引操作线程延时启动的时间,单位为秒
    private int lazyTime = 10;
 
    // Compass封装
    private CompassGps compassGps;
 
    // 索引线程
    private Thread indexThread = new Thread() {
 
        @Override
        public void run() {
            try {
                Thread.sleep(lazyTime * 1000);
 
                log.info("begin compass index...");
                long beginTime = System.currentTimeMillis();
                // 重建索引.
                // 如果compass实体中定义的索引文件已存在,索引过程中会建立临时索引,
                // 索引完成后再进行覆盖.
                compassGps.index();
                long costTime = System.currentTimeMillis() - beginTime;
                log.info("compss index finished.");
                log.info("costed " + costTime + " milliseconds");
            } catch (InterruptedException e) {
            }
        }
    };
 
    /**
     * 实现<code>InitializingBean</code>接口,在完成注入后调用启动索引线程.
     * @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet()
     */
    public void afterPropertiesSet() throws Exception {
        if (buildIndex) {
            indexThread.setDaemon(true);
            indexThread.setName("Compass Indexer");
            indexThread.start();
        }
    }
 
    public void setBuildIndex(boolean buildIndex) {
        this.buildIndex = buildIndex;
    }
 
    public void setLazyTime(int lazyTime) {
        this.lazyTime = lazyTime;
    }
 
    public void setCompassGps(CompassGps compassGps) {
        this.compassGps = compassGps;
    }
}
 

 

5、进行简单搜索

 

Compass compass = compassTemplate.getCompass();
CompassSession session=compass.openSession();
List list = new ArrayList();
CompassHits hits= session.queryBuilder().queryString(queryString).toQuery().hits();
for(int i=0;i<hits.length();i++){
    Person hit=( Person)hits.data(i);
    list.add(hit);
}
session.close();
return list;
 

 




以上内容有参考他人之处,不在这列出,谢谢!


 

  • 大小: 37.9 KB
分享到:
评论

相关推荐

    compass教程.pdf

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

    compass 全文搜索

    1. **Lucene基础知识**:理解Lucene的索引结构、倒排索引、Term和Document的概念,以及如何使用Analyzer处理文本。 2. **Compass配置**:设置数据源、映射文件、索引位置等,创建并启动Compass实例。 3. **对象...

    Sass和Compass 实战

    ### Sass与Compass实战知识点详解 #### 一、Sass简介 Sass(Syntactically Awesome Style Sheets)是一种预处理器脚本语言,用于扩展CSS的功能。它为CSS增加了诸如变量、嵌套规则、混合器(mixins)、继承、函数等...

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

    在书中,作者详细介绍了Sass的基础知识,包括如何设置环境、创建和导入.scss文件、定义变量、使用嵌套规则以及操作列表和映射等。通过阅读《Sass和Compass设计师指南》,你可以学习到如何有效地组织和管理你的CSS...

    compass-reference.pdf

    根据给定的文件信息,我们可以深入探讨Compass——一个强大的Java搜索引擎库,以及其核心概念、配置方式、连接管理、搜索引擎特性等关键知识点。 ### Compass概述 Compass是为Java开发人员设计的一个高性能、高...

    compass2简单例子

    在描述中提到了一个博客链接,博主QSrock在ITEYE上分享了关于 Compass 的知识。通过访问这个博客,我们可以学习到 Compass 的安装、配置、以及如何在实际项目中应用 Compass 来提高 CSS 编写的效率和可维护性。 ...

    compass全文检索

    网站快速加入全文检索文档,介绍compass基础知识入门、准备、开发入门等

    sass与compass实战

    通过学习这些知识点,开发者不仅可以深入了解SASS和Compass的工作原理,还能掌握一系列最佳实践和技巧,从而在实际项目中更加高效地工作。无论是初学者还是有一定经验的前端开发者,都能从中受益匪浅。

    Sass和Compass设计师指南源代码

    1. **Chapter 2**: 这一章可能介绍了Sass的基础知识,如变量的使用($var)、嵌套规则(&)和注释。通过学习,设计者可以理解如何用Sass编写更易读、更可维护的CSS代码。 2. **Chapter 4**: 可能探讨了Sass的嵌套...

    简单的compass示例源码

    Compass的核心是构建在Apache Lucene之上,Lucene是一个强大的文本搜索库,而Compass则在其基础上添加了对ORM(对象关系映射)框架的支持,如Hibernate和JPA。这个压缩包中的"简单的compass示例源码"是为了帮助...

    struts2+spring2.5+hibernate3.26+compass2.1搜索引擎简单实现(无jar包)

    总结来说,这个项目涉及了Web应用开发的关键技术和搜索引擎集成,对于初学者来说,既能巩固基础知识,又能学习到高级应用。在实践中,不断学习和优化,可以提升对这些框架的理解和使用技巧,为今后的开发工作打下...

    Sass and Compass In Action

    《Sass和Compass In Action》是一本专注于Sass和Compass技术的实践指南书籍,旨在教授...书中的知识涵盖了从基础语法到生产环境优化的各个层面,内容深入浅出,旨在帮助开发者提升在Web开发领域的实践能力和创新思维。

    compass和wellplan学习总结.pdf

    下面是Compass和WellPlan学习总结的知识点: 1. 井设计基本概念:井设计是油气井的核心部分,涉及到井的结构、布局、尺寸、材料等方面。Compass和WellPlan都是基于井设计的软件工具,旨在帮助用户设计和优化油气井...

    compass_grid

    1. **Sass基础知识**:了解Sass变量、嵌套规则、混合(mixins)和函数等基本概念,是使用"compass_grid"的前提。 2. **Grid布局原理**:理解网格系统的原理,包括列数、间隔、断点(breakpoints)以及媒体查询...

    compass sensor

    在IT行业中,传感器技术是物联网(IoT)和嵌入式系统中的重要组成部分,而“compass sensor”(指南针传感器)则是其中一种特殊类型的传感器,主要用于确定设备的方向或朝向。基于C#技术开发的指南针传感器应用为用户...

    Mi_Compass.zip

    总的来说,"Mi_Compass.zip"不仅是一个源码学习资源,也是一个实战演练的机会,它涵盖了Android应用开发的关键环节,可以帮助学习者建立起扎实的Android开发基础,提升解决问题的能力,无论是对个人的学术研究还是...

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

    总的来说,这个资源包为想要提升 CSS 技能的设计师提供了一个全面的学习路径,从基础知识到高级技巧,再到实战应用,覆盖了 Sass、Compass 和 Susy 的核心内容。通过深入学习和实践,你将能够更好地掌握响应式设计的...

    android Mi-Compass源码.rar

    通过以上分析,我们可以看到Android Mi-Compass源码中涵盖了Android编程基础、传感器应用、数据处理、UI设计等多个方面的知识。深入学习这段源码,不仅可以帮助我们理解指南针应用的工作原理,也能提升在Android开发...

Global site tag (gtag.js) - Google Analytics