`
zhangljerry
  • 浏览: 144362 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

理解Compass的配置文件

阅读更多
Compass是建立在Lucene基础之上的一款开放源码的JAVA搜索引擎框架。关于Compass的介绍在此我不多讲了,更多了解请直接参考http://www.opensymphony.com/compass。
    很多看了Compass的人多少对Compass的配置文件都有点云里雾里的感觉(我最开始也如此:P)。由于Compass有很多地方都借鉴了Hibernate的思想,在此我结合Hibernate中的思想来帮助我们对Compass的配置文件进行理解。
    Hibernate是一个O/R Mapping工具,它可以将实体对象和数据库中的表进行映射。最终通过访问实体对象来达到访问数据库的目的。
    Compass是一个搜索引擎框架,它可以将common meta data与实体对象进行映射。最终通过访问common meta data来达到访问对象的目的。
    综上所述,Hibernate是对象到数据库。而Compass是common meta data 到对象。

Compass的配置文件主要分成三类:

    第一类:*.cmd.xml文件

    *.cmd.xml文件是对common meta data进行定义,我们就可以把它是当作Hibernate中的POJO来理解。里面定义了最终搜索的结果中的最基本的元数据。下面是一个*.cmd.xml文件的片断:

<compass-core-meta-data>
    <meta-data-group id="petclinic" displayName="Petclinic Meta Data">  
        <descrīption>Petclinic Meta Data</descrīption>
        <uri>http://compass/sample/petclinic</uri>      
        <alias id="vet" displayName="Vet">
            <descrīption>Vet alias</descrīption>
            <uri>http://compass/sample/petclinic/alias/vet</uri>
            <name>vet</name>
        </alias>
       …………
        <meta-data id="petType" displayName="Pet Type">
            <descrīption>The type of a pet</descrīption>
            <uri>http://compass/sample/petclinic/petType</uri>
            <name>petType</name>
        </meta-data>
    </meta-data-group>
</compass-core-meta-data> 

在这里

<meta-data-group id="petclinic" displayName="Petclinic Meta Data">  可当作是POJO的package来理解,petclinic可以看成是package name。

<alias id="vet" displayName="Vet"> 可当作是POJO的Class来理解,vet 可以看成是class name。

<meta-data id="petType" displayName="Pet Type">可当作是POJO的property来理解,petType可以看成是property name。

上面xml中所定义的meta data 和alias就是compass需要查询的所有的基本元素组件。

然而common meta data的定义与POJO所不同的是:POJO是用java代码来体现,而common meta data使用xml来体现。POJO的class中定义了property,common meta data中的alias和meta-data是分开定义。

当然上面都是一个类比而已, 其目的是为了便于让我们理解,实际生成的代码并非如上所述的一一对应。compass提供了一个ant task可以将common meta data生成一个class。代码片断如下:

public final class Petclinic {
    /**
     * Petclinic Meta Data
     */
    public static final class Group {
       public static final String Id = "petclinic";
       public static final String DispayName = "Petclinic Meta Data";
       public static final String Uri = "http://compass/sample/petclinic";
    }
    public static final class Alias {
       /**
        * Owner alias
        */
       public static final class Owner {
           public static final String Id = "owner";
           public static final String Name = "owner";
           public static final String DisplayName = "Owner";
           public static final String Uri = "http://compass/sample/petclinic/alias/owner";
           public static final String GroupId = "petclinic";
       }
    }
    ……
}

    第二类:*.cpm.xml文件

    *.cpm.xml就是Object/Search Engine Mapping了。 我们也可以拿她当作同Hibernate中的*.hbm.xml来理解。他的作用就是提供了POJO到common meta data的映射。下面是一个*.cpm.xml文件的片断:

<compass-core-mapping package="org.compass.sample.petclinic">
    <contract alias="entity">
        <id name="id" />
    </contract>
    <contract alias="person" extends="entity">
        <property name="firstName">
            <meta-data>${petclinic.firstName}</meta-data>
        </property>
        <property name="lastName">
            <meta-data>${petclinic.lastName}</meta-data>
        </property>
        <property name="address">
            <meta-data>${petclinic.address}</meta-data>
        </property>
        <property name="city">
            <meta-data>${petclinic.city}</meta-data>
        </property>
        <property name="telephone">
            <meta-data>${petclinic.telephone}</meta-data>
        </property>
    </contract>
    <class name="Specialty" alias="${petclinic.specialty}" root="false">
        <property name="name">
            <meta-data>${petclinic.specialty}</meta-data>
        </property>
    </class>

    <class name="Owner" alias="${petclinic.owner}" extends="person">
        <property name="firstName">
            <meta-data>${petclinic.firstName}</meta-data>
        </property>
        <property name="lastName">
            <meta-data>${petclinic.lastName}</meta-data>
        </property>
        <property name="address">
            <meta-data>${petclinic.address}</meta-data>
        </property>
        <property name="city">
            <meta-data>${petclinic.city}</meta-data>
        </property>
        <property name="telephone">
            <meta-data>${petclinic.telephone}</meta-data>
        </property>
        <reference name="petsInternal" ref-alias="${petclinic.pet}"  />
    </class>
</compass-core-mapping>

   上面 package对应了POJO的包名,class对应了POJO类名,contract为POJO中一些较为Base类, property对应了POJO的属性。上面看到的像ANT中的${*}就是*.cmd.xml 中所定义的common meta data。通常来说*.cmd.xml中的alias同POJO的Class进行映射。Meta data 同Class中的property进行映射。更多的映射的细节在此不多讲。可以参考 Compass的中自带的Sample Petclinic来理解。


    第三类:*.cfg.xml文件

    Compass的*.cfg.xml文件就和Hibernate的*.cfg.xml有些类似了。下面是一个*.cfg.xml文件的内容:

<compass-core-configuration>
    <compass>  
        <setting name="compass.engine.connection">target/index</setting>      
        <meta-data resource="org/compass/sample/library/library.cmd.xml" />   
        <mappings>
               <class name="test.Author" />
        </mappings>
    </compass>
</compass-core-configuration>

上面
<setting name="compass.engine.connection">target/index</setting>    指定了索引文件存放的路径。

<meta-data resource="org/compass/sample/library/library.cmd.xml" />  指定了*.cmd.xml文件存放的路径。

<mappings><class name="test.Author" /></mappings>是对compass的mapping文件进行指定。Test.Author对应的文件是test/Author.cpm.xml.

<compass>是对compass中的compass类进行的一些参数设置,这个compass是一个重量级的类,类似于Hibernate中SessionFactory.


当Hibernate同Spring进行整合后,Hibernate就不需要*.cfg.xml这个文件了,借而代之的是用Spring的配置文件来进行配置。同样,Compass同Spring进行整合后,*.cfg.xml也可以不需要了。比如如下的Spring配置。

<!-- 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 -->

     在上诉的配置文件中又引出了两个新的知识点,CompassGps和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去实时更新索引文件。
分享到:
评论
1 楼 lljhyp 2008-12-14  
如何使用compass自带的ant task将cmd.xml文件中的common meta data生成class文件

相关推荐

    Struts+Hibernate+spring+jpa+lucene+jbpm+compass配置文件

    整合这些技术时,开发者通常会创建一个综合的配置文件体系,例如Spring的配置文件可以管理所有组件的依赖和配置,通过引入Struts、Hibernate、JPA、Lucene、JBPM和Compass的相关配置。这需要对每个框架的原理有深入...

    compass完整可用项目

    此项目对于理解Compass和Lucene在实际应用中的使用,以及如何结合SSH框架开发Java Web应用具有很高的学习价值。通过分析和研究这个项目,开发者可以深入掌握Java全文搜索引擎的实现,以及如何在SSH框架下组织和管理...

    java搜索 compass资料

    这通常包括设置Compass的配置文件(如`compass.cfg.xml`),以及定义索引和搜索策略等。具体配置项取决于项目的需求,例如索引存储位置、索引更新频率等。 #### 五、Compass 高级特性 Compass 提供了许多高级特性...

    compass入门指南

    - **CompassConfiguration**:类似于HibernateConfiguration,负责Compass的参数设定、配置文件加载以及映射定义。它是创建Compass接口的基础。 - **Compass**:类似于HibernateSessionFactory,用于创建线程安全的...

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

    - `snapshot_blob.bin` 和 `natives_blob.bin`:这些可能是应用程序的特定二进制数据文件,用于存储程序运行时需要的资源或配置信息。 - `icudtl.dat`:这是Unicode的国际化数据文件,用于处理各种语言和字符集的...

    Compass 的java代码

    对于初学者来说,理解Compass的基本概念和用法是关键。首先,你需要配置Compass,指定数据源和索引位置。接着,定义对象-搜索映射文件(`.cmap.xml`),将你的Java类与Lucene字段对应起来。然后,你可以使用Compass...

    compass的几个入门网页

    这将创建一个名为`my_project`的目录,包含基本的Compass配置和文件结构。 四、Compass的主要功能 1. **网格系统**:Compass提供了多种布局网格系统,如 Blueprint 和 Susy,便于创建响应式网页。 2. **字体图标**...

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

    这份文档对于理解Compass的工作原理和实际应用是非常有价值的。 `lucene总结.chm`和`compassAPI.chm`是关于Lucene和Compass API的离线帮助文件,它们分别详细介绍了Lucene的核心功能和Compass的各种接口。通过查阅...

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

    2. **配置 Compass**:创建一个 Compass 配置文件,定义搜索引擎的连接参数,例如目录或数据库的位置,以及要索引的数据源。还可以设置分析器(Analyzer),用于处理文本数据。 3. **创建索引**:使用 Compass 提供...

    Compass原理深入学习笔记

    在理解Compass之前,我们需要先了解全文检索的基本概念和原理。 全文检索是相对于传统的基于字段查询的数据库查询而言的。在数据库查询中,我们通常使用SQL语句,例如`LIKE %ming%`来查找包含"ming"的记录,但这并...

    简单的compass示例源码

    1. **Compass配置**:如何设置Compass的配置文件,包括数据源、索引位置、分析器等。 2. **对象绑定**:理解如何将应用程序中的对象与Compass索引关联,以便自动创建和更新索引。 3. **索引创建**:学习如何在程序...

    compass 全文搜索

    2. **Compass配置**:设置数据源、映射文件、索引位置等,创建并启动Compass实例。 3. **对象映射**:学习如何定义对象的属性与Lucene字段的对应关系,包括字段类型、是否存储、是否索引等。 4. **索引操作**:...

    compass-reference.pdf

    DTDBased配置结合了DTD(Document Type Definition)和XML,用于定义配置文件的结构和验证规则。 ### 连接管理 #### FileSystemStore 文件系统存储是默认的存储方式,数据保存在本地磁盘上,适用于大多数情况。 #...

    Compass简单学习

    在项目配置文件`config.rb`中,可以设置项目路径、CSS输出目录、导入路径等。 **4. 使用Compass** - **创建样式表**:Compass项目中,主要工作在`.scss`文件中进行,这些文件会被编译成标准的CSS文件。例如,`...

    Compass与ssh框架整合

    1. **安装与配置Compass**:下载并添加Compass库到项目的类路径,然后在配置文件(如`compass.cfg.xml`)中指定索引存储位置,以及需要索引的数据源。 2. **配置SSH框架**:在Spring配置文件中定义Compass相关的...

    Compass.rar

    2. **配置文件**:可能包含Compass的配置XML,定义了搜索引擎的设置,如索引的位置、分析器的选择等。 3. **测试用例**:JUnit测试类,用于验证Compass功能的正确性,包括索引构建、查询执行和结果验证。 4. **依赖...

    compass2简单例子

    标签 "源码" 和 "工具" 提示我们,这个压缩包可能包含了一个简单的 Compass 项目源码,以及可能用于演示 Compass 功能的工具或者配置文件。用户可以下载这个 sampleCompass 压缩包,然后跟随博客中的步骤来实践操作...

    跋山涉水解析compass官方sample

    5. 浏览CSS输出:检查编译后的`.css`文件,理解Compass如何将Sass语法转换为浏览器可识别的CSS。 6. 实践与应用:尝试修改SCSS文件,观察CSS的变化,加深对Compass的理解。 通过以上步骤,你不仅可以了解Compass的...

    指南针Compass

    在项目中,开发者可以创建一个名为"compass.conf.rb"的配置文件,自定义Compass的设置,如指定输出目录、引入的模块等。 总的来说,指南针Compass是CSS开发的一个强大辅助工具,它提供了一种更高效、更模块化的方式...

    mongodb-compass 1.16版本

    在1.16版本中,MongoDB Compass提供了直观的界面,帮助用户更好地理解和操作MongoDB数据存储。这个版本是针对Windows 32位和64位系统的,文件名为`mongodb-compass-1.16.0-win32-x64.exe`。 首先,MongoDB Compass...

Global site tag (gtag.js) - Google Analytics