`

Compass简单介绍

 
阅读更多
1、Compass简单介绍

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

  Compass包括以下功能: 

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

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

          * 事务管理,

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

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

          * 简单的API.

2、Compass的优点与缺点

   优点:

      * Compass将lucene、Spring、Hibernate三者的起来,以很低很低的成本快速实现企业应用中的搜索功能;

      * 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进行联合使用。但我没有真正的去使用过。

         

3、Compass

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

   方式。

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

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

  

   (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事务的接口。使用它并不需要事务管理环境(像Spring、JTA)。






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



再把两个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)


使用查询字符串查询


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



4、Compass、Lucene、Spring、Hibernate集成

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





使用Lucene2.4.1;Compass2.2.0







Java代码 
1.<!-- 使用annotation配置,指定要转换的POJO。PO类在compass的classMappings值指定 --> 
2.    <bean id="annotationConfiguration" 
3.        class="org.compass.annotations.config.CompassAnnotationsConfiguration"> 
4.    </bean> 
5.    
6.   <bean id="compass" class="org.compass.spring.LocalCompassBean"> 
7.        <!-- OSEM映射的对象PO类 --> 
8.        <property name="classMappings"> 
9.            <list> 
10.               <value>com.core.persistence.po.Article</value> 
11.               <value>com.core.persistence.po.Author</value> 
12.            </list> 
13.        </property> 
14.        <!-- 使用注解配置 --> 
15.        <property name="compassConfiguration" ref="annotationConfiguration"/> 
16.        <property name="compassSettings"> 
17.            <props> 
18.                <!-- 索引文件在服务器上的存储路径 如:file://d:/index --> 
19.                <prop key="compass.engine.connection">/lucene/indexes</prop> 
20.                <!-- 在内存中建立索引 
21.               <prop key="compass.engine.connection">ram://index</prop> 
22.               --> 
23.                <prop key="compass.transaction.factory"> 
24.                    org.compass.spring.transaction.SpringSyncTransactionFactory 
25.                 </prop> 
26.                 <!-- 配置高亮为红色 --> 
27.                <prop key="compass.engine.highlighter.default.formatter.simple.pre"> 
28.                    <![CDATA[<font color="red"><b>]]> 
29.                </prop> 
30.                <prop 
31.                    key="compass.engine.highlighter.default.formatter.simple.post"> 
32.                    <![CDATA[</b></font>]]> 
33.                </prop> 
34.            </props> 
35.        </property> 
36.  
37.        <property name="transactionManager" ref="transactionManager"/> 
38.    </bean> 
39.    
40.    <bean id="compassTemplate" class="org.compass.core.CompassTemplate"> 
41.        <property name="compass" ref="compass"/> 
42.    </bean> 
43.    
44.    <!-- 与hibernate的绑定,经Hiberante的数据改变会自动被反射到索引里面(增加、修改、删除操作). --> 
45.   <bean id="hibernateGpsDevice" 
46.        class="org.compass.gps.device.hibernate.HibernateGpsDevice"> 
47.        <property name="name"> 
48.            <value>hibernateDevice</value> 
49.        </property> 
50.        <property name="sessionFactory" ref="sessionFactory"/> 
51.        <property name="mirrorDataChanges"> 
52.            <value>true</value> 
53.        </property> 
54.    </bean> 
55.    
56.    <bean id="compassGps" class="org.compass.gps.impl.SingleCompassGps" 
57.        init-method="start" destroy-method="stop"> 
58.        <property name="compass" ref="compass"/> 
59.        <property name="gpsDevices"> 
60.            <list> 
61.              <ref local="hibernateGpsDevice"/>   
62.            </list> 
63.        </property> 
64.    </bean> 
65.  
66.    <!-- 定时重建索引(利用quartz)或随Spring ApplicationContext启动而重建索引 --> 
67.    <bean id="compassIndexBuilder" class="com.lucene.service.CompassIndexBuilder" lazy-init="false"> 
68.        <property name="compassGps" ref="compassGps"/> 
69.        <property name="buildIndex" value="true"/> 
70.        <property name="lazyTime" value="10"/> 
71.    </bean> 
72.  
73. 
74.  
75.public class CompassIndexBuilder implements InitializingBean { 
76.  
77.    private static final Logger log = Logger.getLogger(CompassIndexBuilder.class); 
78.  
79.    // 是否需要建立索引,可被设置为false使本Builder失效. 
80.    private boolean buildIndex = true; 
81.  
82.    // 索引操作线程延时启动的时间,单位为秒 
83.    private int lazyTime = 10; 
84.  
85.    // Compass封装 
86.    private CompassGps compassGps; 
87.  
88.    // 索引线程 
89.    private Thread indexThread = new Thread() { 
90.  
91.        @Override 
92.        public void run() { 
93.            try { 
94.                Thread.sleep(lazyTime * 1000); 
95.  
96.                log.info("begin compass index..."); 
97.                long beginTime = System.currentTimeMillis(); 
98.                // 重建索引. 
99.                // 如果compass实体中定义的索引文件已存在,索引过程中会建立临时索引, 
100.                // 索引完成后再进行覆盖. 
101.                compassGps.index(); 
102.                long costTime = System.currentTimeMillis() - beginTime; 
103.                log.info("compss index finished."); 
104.                log.info("costed " + costTime + " milliseconds"); 
105.            } catch (InterruptedException e) { 
106.            } 
107.        } 
108.    }; 
109.  
110.    /**
111.     * 实现<code>InitializingBean</code>接口,在完成注入后调用启动索引线程.
112.     * @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet()
113.     */ 
114.    public void afterPropertiesSet() throws Exception { 
115.        if (buildIndex) { 
116.            indexThread.setDaemon(true); 
117.            indexThread.setName("Compass Indexer"); 
118.            indexThread.start(); 
119.        } 
120.    } 
121.  
122.    public void setBuildIndex(boolean buildIndex) { 
123.        this.buildIndex = buildIndex; 
124.    } 
125.  
126.    public void setLazyTime(int lazyTime) { 
127.        this.lazyTime = lazyTime; 
128.    } 
129.  
130.    public void setCompassGps(CompassGps compassGps) { 
131.        this.compassGps = compassGps; 
132.    } 
133.} 
  


5、进行简单搜索





Java代码 
1.Compass compass = compassTemplate.getCompass(); 
2.CompassSession session=compass.openSession(); 
3.List list = new ArrayList(); 
4.CompassHits hits= session.queryBuilder().queryString(queryString).toQuery().hits(); 
5.for(int i=0;i<hits.length();i++){ 
6.    Person hit=( Person)hits.data(i); 
7.    list.add(hit); 
8.} 
9.session.close(); 
10.return list; 
分享到:
评论

相关推荐

    Compass简单学习

    【标题】"Compass简单学习"所涉及的知识点主要集中在两个方面:一是对Compass工具的理解,二是如何使用Compass进行源码分析和开发辅助。Compass是一个强大的样式表(CSS)编译器,它基于Sass语言,帮助开发者更高效...

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

    Compass项目是由华为Wei Shao在2016年的中国OpenStack Days上介绍的一个开源项目。它的主要目标是提供一个简单、可扩展、并且可以远程管理数据中心的解决方案。Compass项目具有可视化管理界面,支持多种服务器、...

    使用compass+lucene实现简单的全文检索功能

    本文将详细介绍如何使用 Compass 和 Lucene 实现一个简单的全文检索功能。 首先,Lucene 是一个高性能、全功能的文本分析库,主要用于信息检索。它提供了索引和搜索大量文本数据的能力,包括分词、分析、存储和搜索...

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

    本文将介绍Compass,一个基于Lucene的全文搜索引擎库,为Java开发者提供了一种简单易用的方式来集成全文检索功能。Compass不仅提供了与ORM框架(如Hibernate、JPA等)的无缝集成,还支持动态索引更新,使得实时数据...

    基于Compass2.2与Spring 结合建立索引的实例

    通过以上介绍,我们了解了如何基于Compass2.2与Spring结合建立索引的过程。这不仅包括了模型定义、配置文件编写等内容,还涉及到了如何与Spring框架结合,实现项目的快速搜索功能。这对于企业级项目中需要集成全文...

    compass索引插件demo

    下面将详细介绍如何在Java SSH框架中集成Compass插件,并探讨相关知识点。 **SSH框架** SSH(Spring、Struts和Hibernate)是一种常见的Java Web开发框架组合。Spring提供依赖注入和事务管理,Struts负责MVC架构,...

    compass使用手册

    本手册将详细介绍Compass的使用方法和特性,对初学者来说具有很高的学习价值。 一、安装Compass 在使用Compass之前,你需要先安装Ruby(Compass基于Ruby)以及RubyGems,这两个组件通常会一起安装。接着,通过...

    compass-reference.pdf

    此文档为 Compass 2.1.0 版本的参考手册,详细介绍了如何配置和使用 Compass 进行搜索和索引操作。 #### 使用指南 - **Lucene**:Compass 基于 Lucene 构建,因此了解 Lucene 的基础知识对于使用 Compass 至关重要...

    基于Java的Luncene的compass框架说明使用技术文档.pdf

    下面介绍如何在SSH环境下使用Compass。 ##### Step 1: 添加依赖库 在SSH项目基础上加入Compass相关jar包,包括但不限于: - `compass-2.1.2.jar`:Compass核心库 - `compass-index-patch.jar`:Compass索引扩展库 ...

    效率源Data Compass 热交换快速提取指定数据的数据恢复教程.doc

    Data Compass 热交换快速提取指定数据的数据恢复教程主要介绍了如何使用 Data Compass 配合热交换技术来恢复硬盘数据。该教程主要针对以下几种故障:简单故障,如分区丢失、文件丢失破坏、病毒破坏、误格式化、误...

    Python库 | compass_interface_core-0.6.1-py3-none-any.whl

    本文将详细介绍Python库`compass_interface_core`的版本`0.6.1`,以及其在开发中的应用和作用。 `compass_interface_core`是一个专门为Python设计的库,其核心功能是提供与指南针设备交互的接口。在0.6.1这个版本中...

    compass-sample:Telrik Compass 示例

    2. **Compass API介绍**:在JavaScript中,罗盘API提供了`watchHeading`和`clearWatch`两个主要方法。`watchHeading`用于持续监听罗盘的实时数据,`clearWatch`则用于停止监听。 3. **处理罗盘数据**:罗盘数据通常...

    Vue CLI3中使用compass normalize的方法

    这里我们将详细介绍如何在Vue CLI3环境中集成和使用`compass normalize`。 首先,我们需要了解`normalize.css`和`compass`这两个概念。`normalize.css`是一个现代化的、可定制的CSS重置库,它的目的是使不同浏览器...

    brew开发工具安装,开发过程介绍

    它允许用户通过简单的命令行操作来安装、更新和管理各种开源软件,极大地简化了在苹果操作系统上安装和维护软件的过程。 **一、Brew安装** 在开始使用Brew之前,首先需要安装它。Brew的安装非常简单,通常可以通过...

    compass-libsass:更新指南针mixin库以与libsass和gruntgulpyeoman一起正常工作

    这篇内容将详细介绍如何更新 Compass Mixin 库以使其与 Libsass 和 Grunt(或 Gulp、Yeoman)配合工作,从而提升开发效率。 首先,Compass 是一个基于 Sass 的框架,它扩展了 Sass 的功能,包括预定义的 mixin、...

    code-compass:一组代码分析可帮助您解决软件复杂性

    我在介绍了一些代码罗盘功能。 学分 该项目的很大一部分依赖于以及他的作者Adam Tornhill的聪明才智。 他的书鼓舞人心,。 安装和依赖项 注意:当需要依赖项的命令警告您由于缺少依赖项而无法执行时,我将依赖项...

    MongoDB数据库管理工具_robomongo

    1. **界面友好**:RoboMongo提供了一个简洁的用户界面,使得对MongoDB数据库的交互变得简单易行。无论是创建、修改、查询文档,还是进行数据库备份和恢复,都可以通过直观的界面完成。 2. **多平台支持**:...

    px4飞控磁罗盘校准算法理论与代码结合解读

    文章首先通过一个简单的最小二乘法引例来引导读者理解算法的基本概念。在这个例子中,通过数学推导来演示如何找到一条直线,使得该直线的拟合误差平方和最小。这种方法是解决线性问题的基础,而在磁罗盘校准中,涉及...

    Lucene 3.0完成入门

    本篇文章将围绕 Lucene 3.0 版本,详细介绍其入门知识,并通过提供的文档列表,帮助你深入了解并实现简单的搜索功能。 1. **Lucene 3.0 的基础概念** - **索引**:Lucene 的核心是索引,它是一种预处理步骤,将...

    自己动手写搜索引擎

    本章节通过一个简单的实例来介绍如何使用Lucene进行文本索引和搜索,让读者快速上手。 #### 三、Lucene索引的建立 - 在这一章节中,作者深入探讨了Lucene索引的建立过程,包括索引的结构、索引文档的格式、文档的...

Global site tag (gtag.js) - Google Analytics