- 浏览: 6568 次
- 性别:
- 来自: 江苏
文章分类
最新评论
Compass简单介绍
- 博客分类:
- lucene
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是一个强大的,事务的,高性能的对象/搜索引擎映射(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;
相关推荐
对lucene和compass简单的介绍,以及对compass的普通操作进行的性能分析
我在介绍了一些代码罗盘功能。 学分 该项目的很大一部分依赖于以及他的作者Adam Tornhill的聪明才智。 他的书鼓舞人心,。 安装和依赖项 注意:当需要依赖项的命令警告您由于缺少依赖项而无法执行时,我将依赖项...
介绍 ECA需要预渲染的图块才能显示地图。 此概念允许在没有互联网连接且独立于其他资源的情况下使用地图。 这也是显示地图的最简单方法,并且在Infotainment系统上具有相当不错的性能。 但是,它带有预先渲染这些图...
安装依赖项你需要有: Ruby & Bundler 节点和 NPM 吞咽(npm install -g gulp) 然后你可以简单地执行./install.sh 它将安装: 您需要的 Ruby gems(本地使用 Bundler,在 Gemfile 中指定) 您需要的节点包(本地...
2015年在读GW 由于前端不是很好,补充了动代码上手的知识和经验点。这一次,我们将重点介绍以下技术。 Sass / Scss + 指南针... Compass 就像一个建立在 Sass/Scss 之上的框架,而且相当方便,因为 Compass 可以为你做
网上发行的一个资料很适合初学者,安卓经典Android开发入门教程,有实例,有android开发视频教程,还附带源码,欢迎各位下载... Android for eclipse plug in 在安装过程很简单,通过网络安装插件就可以了,这个是 URL
1.4 ext js的开发工具的获取、安装与配置介绍 / 18 1.4.1 ext designer / 18 1.4.2 在visual studio中实现智能提示 / 23 1.4.3 spket / 28 1.4.4 在eclipse中实现智能提示 / 32 1.5 如何获得帮助 / 32 1.6 本...
是目前国内领先的、高水准开源论坛系统(Apache 2.0),不断跟踪和应用全球软件最新设计理念(DDD等背景PPT介绍)。反映软件设计流行方向,是国内最接近云计算的论坛软件。JiveJdon不只是普通论坛,融博客帖子一身,可以...
asynctasks.vim-现代任务系统通过模仿vscode的来处理构建/运行... 这很简单,但是大多数好的设计总是从一个非常简单的概念开始。 您将从该任务系统的生产力和可能性中受益匪浅。开始使用安装用vim-plug安装: Plug ' sk
如果直接依赖不满足你的需求,需要自己修改样式或二进制的话,可以放入库作为模块集成到你的项目中,集成方法参考我的介绍博客: ://blog.csdn.net/yuzhiqiang_1993 版本说明: : 博客: : 扫描二维码下载APK体验...
.NET核心 使用.NET Core 2.0构建微服务 使用此实用的,基于示例的指南... 通过介绍React式微服务,您将在战略上获得更多价值,以使您的代码基础保持简单,将重点放在更重要的内容上,而不是凌乱的异步调用上。 使用.NET
目录介绍Shafi Goldwasser,Silvio Micali和Charles Rackoff首次引入了零知识证明。 零知识证明可以使一方(证明方)说服另一方(检验方)给定的陈述是真实的,而不会透露陈述本身的有效性以外的任何信息。 zkSNARK...
介绍该项目的目的是使参与各方的出勤监控过程更加简单。 目前,可以通过刷学生卡登录会话来监控实验室的出勤情况。 演讲并非如此。 当前,使用传统的基于纸张的签到纸来监视演讲的出席情况。 虽然有效,但该系统无法...
您可以在 Medium 文章中阅读有关稳定基线的详细介绍。 这些算法将使研究社区和行业更容易复制、改进和识别新想法,并将创建良好的基线以在其上构建项目。 我们希望这些工具将被用作可以添加新想法的基础,以及将...
介绍 这是一个简单的计算器包,用于将值相加和相乘 技术领域 Python 3.8 接触 在这里与我联系
介绍 通过浏览器直接将文件上传到IPFS。 您可以选择使用本地或远程运行的IPFS节点,因此安装IPFS节点是可选的。 API的简单直观的Web界面 此处使用的语言(javascript,html和css)适用于任何Web服务器,它们可以与...
我们更喜欢使用运行我们的Django项目,尽管我们不会详细介绍如何安装它((你们都是聪明人:当然,您可以找到适合您的教程))这是基本清单: 创建目录以容纳Gridpak mkdir gridpak && cd gridpak 将此仓库克隆到您...
我们以尽可能简单的方法来实现所有现有的布料模拟算法,以使学习者可以确切地知道要使布料模拟系统在OpenGL中运行并以最小的麻烦进行到底需要什么。 OpenCloth项目的启动是为了帮助初学者和研究人员使用OpenGL API...
一个简单的商品管理的系统,使用的技术有:Maven + Spring + SpringMVC + MyBatis,前端框架boostrap。数据库使用mysql。用到两个表:一个商品信息表,一个种类表。使用外键关联将两个表联结起来。完整代码已上传...
缝在一起的三个Struts学习目标设置事件侦听器以响应用户操作向模拟服务器提交请求根据模拟服务器的响应更新DOM介绍还记得我们开始探索“ Simple Liker”应用程序时的过程吗? 您可能不确定是否会做到这一点,但是您...