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);
Compass 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">
</compass-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">
</file>
<mappings>
<class name="test.Author">
</class>
</mappings>
</connection>
这个是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是需要被索引的。
"-//Compass/Compass Core Mapping DTD 1.0//EN"
"http://www.opensymphony.com/compass/dtd/compass-core-mapping.dtd">
<compass-core-mapping package="eg">
<class alias="author" name="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 ref-alias="book" name="books">
<!---->
</component>
<class alias="book" name="Book">
...
</class>
</id>
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
Compass 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) {
Compass hits = session.find(query);
return new Integer(hits.getLength());
}
}
);
}
return numberOfHits.intValue();
}
<beans>
<bean class="LibraryCompassDao" id="libraryCompass">
<property name="compass">
<ref local="compass">
</ref>
</property>
</bean>
<!---->
<bean class="org.compass.spring.LocalCompassBean" id="compass">
<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">
</ref>
</property>
<bean class="org.compass.spring.device.hibernate.SpringHibernate3GpsDevice" id="hibernateGpsDevice">
<property name="name"><value>hibernateDevice</value></property>
<property name="sessionFactory"><ref local="sessionFactory"></ref>
</property>
<bean destroy-method="stop" init-method="start" class="org.compass.gps.impl.SingleCompassGps" id="compassGps">
<property name="compass"><ref bean="compass"></ref>
<property name="gpsDevices">
<list>
<ref local="hibernateGpsDevice">
</ref>
</list>
</property>
<!---->
<!---->
<bean class="org.springframework.orm.hibernate3.HibernateTransactionManager" id="transactionManager">
<property name="sessionFactory"><ref local="sessionFactory"></ref>
</property>
<!---->
<bean id="annotationConfiguration">
class="org.compass.annotations.config.CompassAnnotationsConfiguration">
</bean>
<!---->
<bean class="org.compass.spring.LocalCompassBean" id="compass">
<!---->
<property name="classMappings">
<list>
<value>com.dengyin.compass.sample.domain.Book</value>
</list>
</property>
<property ref="annotationConfiguration" name="compassConfiguration">
<!---->
<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 ref="transactionManager" name="transactionManager">
</property>
<!---->
<bean class="org.compass.gps.impl.SingleCompassGps" id="compassGps">
init-method="start" destroy-method="stop">
<property ref="compass" name="compass">
<property name="gpsDevices">
<list>
<bean class="org.compass.spring.device.hibernate.SpringHibernate3GpsDevice">
<property name="name">
<value>hibernateDevice</value>
</property>
<property ref="sessionFactory" name="sessionFactory">
</property>
</bean>
</list>
</property>
ok! 相信你对Compass有一定的了解了。 thanks
Compass: http://www.opensymphony.com/compass/
Compass文档:http://www.opensymphony.com/compass/content/documentation.html
trac:http://www.writely.com/View.aspx?docid=ajgd3tgv958v_0fmhxk9
</property></bean></property></bean></bean></property></bean></bean></bean></beans></class></compass-core-mapping></compass>
分享到:
相关推荐
【Compass原理深入学习笔记】 Compass是一款基于Apache Lucene的全文搜索引擎框架,它为开发者提供了更高级别的抽象层,简化了搜索引擎的集成工作。在理解Compass之前,我们需要先了解全文检索的基本概念和原理。 ...
- **Resource**:Compass 对 Lucene 的 Document 的抽象表示,通常用于代表某个实体或文档。 - **Property**:Compass 对 Lucene 的 Field 的抽象表示,用于存储具体的属性值。通过 **CompassConverter framework** ...
`compass学习笔记.doc`是一份关于Compass的学习文档,可能包含了使用Compass的基本步骤,常见问题解答,以及一些最佳实践。这份文档对于理解Compass的工作原理和实际应用是非常有价值的。 `lucene总结.chm`和`...
本文档总结了Compass和WellPlan的学习笔记,涵盖了油气工业中常用的井trajectory设计和分析、Well Planning和设计等方面的知识点。 一、井trajectory设计和分析 井trajectory设计和分析是油气工业中非常重要的一环...
"Lucene&Compass笔记"则专注于全文搜索引擎技术,Lucene是一个高性能、可扩展的信息检索库,而Compass是基于Lucene的一个对象关系映射(ORM)工具,它们在大数据处理和搜索应用中有着广泛应用。"项目笔记"可能涵盖了...
### Extjs 5 学习笔记之 SenchaCmd 深入解析 #### 一、SenchaCmd 的简介 SenchaCmd 是一个跨平台的命令行工具,它为基于 ExtJS 和 Sencha Touch 应用程序的开发周期提供了全面的支持。从创建应用程序的基础结构到...
4. **版本控制**:通过与 Git 等版本控制系统集成,Team-Compass 可以轻松管理代码和文档的历史版本,便于回溯和协作。 **Binderhub 集成** Binderhub 是 JupyterHub 的一个组件,它允许用户通过 URL 直接运行 ...
文档从笔记本电脑的基本概念、发展历程、组成结构以及散热问题等方面进行了详细介绍。 1. 笔记本电脑简介 笔记本电脑,又称便携式电脑或膝上型电脑,英文名Notebook,以其轻巧、便携的特点深受用户喜爱。它的体积和...
这篇文档适用于NXP Semiconductors的Sensor Fusion Toolbox for Windows中的"Gaming Handset"和"Gyro Stabilized Compass"算法。 首先,Kalman滤波是一种统计滤波方法,广泛应用于信号处理和控制理论中,特别适合于...
2. **工作**:团队成员可以共享项目笔记,协同编辑文档,提高工作效率,减少沟通成本。 3. **研究**:研究人员可以整理文献摘要,记录实验数据,便于检索和分析。 4. **个人成长**:个人可以利用xmemo整理读书笔记,...
5. **文档资料**:可能包括AK8963的数据手册、应用笔记、开发者指南等,这些文档详细解释了传感器的工作原理、接口规格、初始化流程以及常见问题解决方法。 6. **测试脚本**:用于验证驱动正确性的自动化测试脚本,...
Librextjs Librextjs是开源javascript框架。 这是使用node.js , compass和jsduck构建的Extjs 4.2.1的jsduck 。...要生成文档,请使用gem安装jsduck 。 $ gem install jsduck $ jsduck 笔记: 当前
在MongoDB的日常使用中,还可以通过管理工具(如MongoDB Compass)进行可视化管理,监控数据库性能,以及进行备份、恢复等操作。总的来说,MongoDB是一个强大且灵活的数据库系统,尤其适合需要处理大量非结构化数据...
这篇应用笔记AN5017主要探讨了在NXP Sensor Fusion Library中支持的三种坐标系统:航空航天、Android和Windows 8。这些坐标系统在不同领域和平台的应用中有其特定的用途和转换规则。 1. 软件功能(Software ...
- **TCPDF**:PDF生成库,用于创建报告或文档。 - **Bootstrap**:前端框架,用于构建响应式的用户界面。 - **Apt-Mirror**:用于镜像APT源,便于内部网络更新软件。 - **DHCP**:动态主机配置协议,用于自动分配IP...
4. 安装Sass需要先安装Ruby,并且可以通过命令行工具`gem`来安装Sass和Compass。 5. Sass的编译方式多样,可以是命令行、Sublime Text插件、Koala等编译软件,或者前端自动化工具如Codekit、Grunt、Gulp等。 6. 卸载...
贝尔斯通智能家居文档 务必 :star: 我的配置库,因此您可以随时了解任何最新进展! 此回购旨在为智能家居带来灵感。 配置,设备,布局,链接的博客文章和YouTube视频应有助于激发您首先进入物联网世界。 这是我的...
2. UL的服务范围广泛,不仅包括上述的安全认证,还涵盖了品质保证和管理方面,如Quality Registered Services (QRS)旨在确保企业的产品和服务质量,以及Compliance Management and Product Assurance (COMPASS)帮助...
Org Mode是Emacs中的一个高度可扩展的文本编辑模式,广泛用于笔记、项目管理、任务追踪甚至编写文档。`ob-clojure-literate`正是将Clojure代码嵌入到Org Mode文档中的桥梁,使得开发者能够在同一个文件中编写文档和...
MongoDB 是一个流行的开源、非关系型数据库系统,以其灵活性、高性能和易扩展性而备受开发者喜爱。...在学习过程中,记得多做笔记,动手实践,遇到问题及时查阅官方文档或社区资源,这样你的技能将会得到快速提升。