`

Compass读文档笔录

阅读更多
Compass是基于Lucene 的更高层的抽象,假如你正打算做关于搜索方面的模块的话,那我建议你使用Compass,他提供了可配置方案,而且比Lucene更加容易使用。如果你的系统中使用Spring, Hibernate,JDO, IBatis。。。 Compass是最好的选择,他能够非常方便的集成到现有系统中去。

1.   Compass的framework的系统结构。
感觉Compass的代码的结构简直就是剽窃Hibernate的,可能Compass的最初目的是用来整合Hibernate的,

CompassConfiguration conf =  new CompassConfiguration().configure().addClass(Author.class);
Compass compass = conf.buildCompass();
CompassSession session = compass.openSession();
CompassTransaction tx = null;

try {
    tx = session.beginTransaction();
   
    session.save(author);
    CompassHits hits = session.find("jack london");
    Author a = (Author) hits.data(0);
    Resource r = hits.getResource(0);
   
    tx.commit();
} catch (CompassException ce) {
    if (tx != null) tx.rollback();
} finally {
    session.close();
}

假如你对Hibernate有了解的话,相信你对Compass会比较容易理解的,你可以把Hibernate的思想转移到Compass上。现在让我们看看他们之间的相似吧。
compass.cfg.xml

<compass-core-config xmlns="http://www.opensymphony.com/compass/schema/core-config"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.opensymphony.com/compass/schema/core-config
           http://www.opensymphony.com/compass/schema/compass-core-config.xsd">

  <compass name="default">
      <connection><file path="target/test-index"/></connection>
      <mappings><class name="test.Author" /></mappings>
   </compass>
</compass-core-config>
这个是Compass总的配置文件,其中定义了索引文件存储的位置(这里是用文件系统,Compass有多种选择,你也可以选数据库或其他),Compass索引的对象是面向PoJo的,这里的是Author,对应的文件是test/Author.cpm.xml.
当然这里面的配置属性不止这么多,更多的属性见Configure属性。

CompassConfiguration conf = new CompassConfiguration()
     .setSetting(CompassEnvironment.CONNECTION, "my/index/dir")
     .addResource(DublinCore.cmd.xml).addClass(Author.class);

Compass compass = conf.buildCompass();
这里我们CompassConfiguration会读取默认的在classpath中的compass.cfg.xml初始化,然后得到Compass对象,可能你会马上意思到这个Compass肯定对应于Hibenate中的SessionFactory,是的,这是一个重量级的对象,

我们需要通过这个对象得到CompassSession,然后进行CRUD操作,CompassSession跟Hibernate中的Session一样是个lightweight对象。关于对Search domain的配置(Author.cpm.xml),大家可以查看cpm文件配置。在那里面主要是定义了哪些properties是需要被索引的。

<?xml version="1.0"?>
<compass-core-mapping package="eg">

  <class name="Author" alias="author">
    <id name="id" />
    <constant>
      <meta-data>type</meta-data>
      <meta-data-value>person</meta-data-value>
      <meta-data-value>author</meta-data-value>
    </constant>
    <property name="name">
      <meta-data>name</meta-data>
      <meta-data>authorName</meta-data>
    </property>
    <property name="birthday">
      <meta-data>birthday</meta-data>
    </property>

    <component name="books" ref-alias="book" />

    <!-- can be a reference instead of component
    <reference name="books" ref-alias="book" />
    -->
  </class>

  <class name="Book" alias="book">
   
  </class>
</compass-core-mapping>
2.  索引文件结构
---[index dir]/index
  |
  |-- [subIndex1]
  |      |
  |      |--- segments
  |      |--- [segment1]
  |      |--- [segment2]
  |
  |-- [subIndex2]
  |      |
  |      |--- segments
  |      |--- [segment1]
  |      |--- [segment2]
  |      |--- [segment3]
  |
...
基本上是一个search domain放到一个subIndex文件夹中,更确切的说是相同alias name的search domain放到相同的sub index folder中。

3.  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();

4.  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 

Compass compass =  // configure compass
CompassGps gps = new SingleCompassGps(compass);

CompassGpsDevice device1 =  // configure the first device
device1.setName("device1");
gps.addDevice(device1);

CompassGpsDevice device2 =  // configure the second device
device2.setName("device2");
gps.addDevice(device2);

gps.start();
.
.
//on application shutdown
gps.stop();
5.  整合Spring,Hibenate
在Compass的lib里面就有非常好的一个sample了(petclinic),里面有对Spring,Hibenate的整合,其实对spring来说也就是通过ioc把CompassGps 和 Compass定义好。CompassGps主要负责re-index和index实时更新
, Compass主要提供了自定义Search部分的入口(CompassTemplate)。Spring提供了对Compass的DAO的整合,在CompassDaoSupport 中拿到CompassTemplate,这个跟spring对hibernatedao的支持是一致的。

public class LibraryCompassDao extends CompassDaoSupport {
    public int getNumberOfHits(final String query) {
       Integer numberOfHits = (Integer)getCompassTemplate().execute(
           new CompassCallback() {
               public Object doInCompass(CompassSession session) {
                  CompassHits hits = session.find(query);
                  return new Integer(hits.getLength());
               }
           }
       );
    }
    return numberOfHits.intValue();
}

<beans>
   <bean id="libraryCompass" class="LibraryCompassDao">
      <property name="compass">
         <ref local="compass" />
      </property>
   </bean>
</beans>
         <!-- COMPASS START -->
    <bean id="compass" class="org.compass.spring.LocalCompassBean">
        <property name="resourceLocations">
            <list>
                <value>classpath:org/compass/sample/petclinic/petclinic.cmd.xml</value>
                <value>classpath:petclinic.cpm.xml</value>
            </list>
        </property>
        <property name="compassSettings">
            <props>
                <prop key="compass.engine.connection">file://${user.home}/compass/petclinic</prop>
                <prop key="compass.transaction.factory">org.compass.spring.transaction.SpringSyncTransactionFactory</prop>
            </props>
        </property>
        <property name="transactionManager">
            <ref local="transactionManager" />
        </property>
    </bean>
         <bean id="hibernateGpsDevice" class="org.compass.spring.device.hibernate.SpringHibernate3GpsDevice">
           <property name="name"><value>hibernateDevice</value></property>
           <property name="sessionFactory"><ref local="sessionFactory" /></property>
         </bean>
         <bean id="compassGps" class="org.compass.gps.impl.SingleCompassGps" init-method="start" destroy-method="stop">
           <property name="compass"><ref bean="compass" /></property>
           <property name="gpsDevices">
             <list>
               <ref local="hibernateGpsDevice" />
             </list>
           </property>
         </bean>
         <!-- COMPASS END -->
        <!-- Transaction manager for a single Hibernate SessionFactory (alternative to JTA) -->
        <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
                <property name="sessionFactory"><ref local="sessionFactory"/></property>
        </bean>


<!----------------------------一下是对anototion的配置。-->
    <bean id="annotationConfiguration"
          class="org.compass.annotations.config.CompassAnnotationsConfiguration">
    </bean>

    <!-- 核心Compass Bean,search及index时使用 -->
    <bean id="compass" class="org.compass.spring.LocalCompassBean">
        <!-- anontaition式设置         -->
        <property name="classMappings">
            <list>
                <value>com.dengyin.compass.sample.domain.Book</value>
            </list>
        </property>

        <property name="compassConfiguration" ref="annotationConfiguration"/>

        <!-- xml 文件式设置
                        <property name="resourceLocations">
                        <list>
                        <value>classpath:compass-springside.cmd.xml</value>
                        <value>classpath:compass-springside.cpm.xml</value>
                        </list>
                        </property>
                -->
        <property name="compassSettings">
            <props>
                <prop key="compass.engine.connection">
                    file://${user.home}/springside/compass
                </prop>
                <prop key="compass.transaction.factory">
                    org.compass.spring.transaction.SpringSyncTransactionFactory
                </prop>
            </props>
        </property>

        <property name="transactionManager" ref="transactionManager"/>
    </bean>

    <!--Compass的GPS绑定,在index时使用-->
    <bean id="compassGps" class="org.compass.gps.impl.SingleCompassGps"
          init-method="start" destroy-method="stop">
        <property name="compass" ref="compass"/>
        <property name="gpsDevices">
            <list>
                <bean class="org.compass.spring.device.hibernate.SpringHibernate3GpsDevice">
                    <property name="name">
                        <value>hibernateDevice</value>
                    </property>
                    <property name="sessionFactory" ref="sessionFactory"/>
                </bean>
            </list>
        </property>
    </bean>
1
1
分享到:
评论

相关推荐

    Compass技术文档

    ### Compass技术文档详解 #### 一、原理描述 Compass是一个高级开源的Java搜索引擎框架,旨在简化应用程序与搜索引擎之间的集成过程。它通过结合强大的Lucene搜索引擎以及流行的应用框架如Hibernate和Spring,使得...

    Compass学习文档1

    Compass 是一个强大的开源搜索引擎框架,它建立在 Lucene 的基础之上,为 Java 开发者提供了更为简洁的搜索引擎 API。Compass 的设计目标是简化搜索引擎的集成,使其能够无缝地与现有的应用程序,如 Hibernate 和 ...

    前端开源库-compass-mixins

    Sass 是一种预处理器,它可以将变量、嵌套规则、混合、函数等高级特性转换成标准的 CSS 代码,使得 CSS 更加易读、易维护。 关于 Compass Mixins,以下是一些关键知识点: 1. **浏览器前缀处理**:Compass 提供了...

    compass完整可用项目

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

    Compass原理深入学习笔记

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

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

    1. 数据浏览:Compass可以显示数据库的集合(类似于关系数据库中的表)以及其中的文档(类似记录)。用户可以通过图形界面查看、编辑和删除单个文档,也可以搜索和过滤数据。 2. 查询构建器:对于不熟悉MongoDB查询...

    mongodb安装包和compass

    MongoDB是一款开源、分布式、高性能的NoSQL数据库,它不使用传统的表格和列式结构来存储数据,而是采用键值对、文档、集合和图形数据模型。这种设计使得MongoDB在处理非结构化和半结构化数据时表现出色,特别适合大...

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

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

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

    1. 数据浏览:Compass可以连接到MongoDB服务器,展示数据库、集合(相当于关系数据库中的表)以及文档(类似JSON格式的数据记录)。用户可以清晰地看到数据结构和内容,便于理解和调试。 2. 查询构建器:对于不熟悉...

    Compass 的java代码

    1. **对象-搜索映射(OSM)**:Compass允许你定义对象-搜索映射,将Java对象与Lucene文档进行关联。这使得可以方便地将Java对象直接索引和检索,而无需处理Lucene的低级API。 2. **自动索引管理**:Compass能自动...

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

    - `@Searchable`:标注该类可被映射到 Lucene 文档。 - `@SearchableId`:标注该字段为唯一标识符。 - `@SearchableProperty`:配置属性的索引方式。 ##### 3.3 使用 Compass API 进行 CURD 操作 - **初始化 ...

    compass搜索引擎技术

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

    compass教程.pdf

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

    compass annotation关联关系

    Compass Annotation 是 Compass 提供的一种基于 Java 注解(Annotation)的映射方式,它可以将 Java 对象的属性与搜索引擎的文档字段关联起来。通过在 Java 类或其属性上添加特定的注解,Compass 可以自动处理对象到...

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

    ### 基于Java的Luncene的Compass框架说明使用技术文档 #### 一、原理描述 Compass是一款优秀的开源Java搜索引擎框架,它能够帮助应用程序实现更为强大的搜索引擎语义能力。Compass依赖于顶级的Lucene搜索引擎,并...

    java搜索 compass资料

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

    compass的几个入门网页

    4. 阅读官方文档和在线教程,加深理解。 5. 参考其他开发者的工作,了解如何在实际项目中使用Compass。 总之,Compass为Web开发者提供了一个强大的工具,通过它可以更有效地管理和组织CSS代码,提高开发效率。作为...

    基于JavaLuncene的compass框架说明使用技术文档.doc

    Compass 支持对对象、持久化对象和 XML 文档的搜索,并具备事务管理功能。其设计灵感来源于 Hibernate,即 ORM 工具,Compass 与 Hibernate 类似,它在 Lucene 之上提供了一层抽象,简化了搜索引擎的集成。 三、...

    基于Luncene的compass框架详解-java

    2. **Compass**: Compass被定义为面向领域模型的搜索框架,这意味着它必须支持对对象的搜索,包括持久化对象和XML文档对象的搜索,并且必须能够处理事务,包括创建、更新、保存和删除操作的事务级处理。因此,...

Global site tag (gtag.js) - Google Analytics