本文是Compass的入门指引,通过实例介绍了Compass与iBatis、Spring的整合,适合不了解Compass的读者,但要求读者了解Lucene、Spring和iBatis,写过一些简单的应用。
文中使用的软件包:
什么是Compass
Compass是一个Java搜索框架。它封装了Lucene,增加了一些Lucene不支持的特性(例如实时更新索引),支持各种数据(Java对象、xml、json)到索引的映射,支持各种数据源(JDBC, Hibernate, iBatis)。
图解(看得烦的直接跳过看下面的例子吧):
• Compass - 一般在程序启动时建立并被整个程序共享,主要用于建立CompassSession并通过其管理索引数据。
• CompassSession - 用于处理数据的session。
• CompassTransaction - 手动进行事务管理,如果不使用,Compass会自动管理事务。
• CompassTemplate - 将session和transaction透明化。
• 数据到索引的各种映射 - OSEM, XSEM, JSEM, RSEM。支持通过程序、XML、JSON进行配置。
• CompassGps - Gps的核心模块,管理GpsDevice,有两种实现:SingleCompassGps和DualCompassGps。
• CompassGpsDevice - 处理各种数据源到索引的操作:JDBC, Hibernate, iBatis等。不能独立使用而必须融合到CompassGps中。
与Spring、iBatis的整合
建索引
1、假设Spring + iBatis的框架已经搭建好。
2、配置Domain的OSEM
Java代码
1. @Searchable(alias="user")
2. public class User {
3.
4. @SearchableId
5. private int id;
6.
7. @SearchableProperty(index=Index.ANALYZED, store=Store.YES)
8. private String name; // 姓名
9.
10. @SearchableProperty(index=Index.NOT_ANALYZED, store=Store.YES)
11. private String gender; // 性别
12.
13. @SearchableProperty(index=Index.NOT_ANALYZED, store=Store.YES)
14. private int age; // 年龄
15.
16. public User() {
17. }
18.
19. public User(String name, String gender, int age) {
20. setName(name);
21. setGender(gender);
22. setAge(age);
23. }
24.
25. public int getId() {
26. return id;
27. }
28.
29. public void setId(int id) {
30. this.id = id;
31. }
32.
33. public String getName() {
34. return name;
35. }
36.
37. public void setName(String name) {
38. this.name = name;
39. }
40.
41. public String getGender() {
42. return gender;
43. }
44.
45. public void setGender(String gender) {
46. this.gender = gender;
47. }
48.
49. public int getAge() {
50. return age;
51. }
52.
53. public void setAge(int age) {
54. this.age = age;
55. }
56.
57. }
其实就是加几个Annotation而已。看到Index.ANALYZED、Store.YES这些东西,用过Lucene的应该大概都明白了吧。
• @Searchable - 指明该类可被映射至索引,alias参数是这一类索引对象的别名。
• @SearchableId - 索引对象的id,在同一类索引对象(同一个alias)中唯一标识一个对象。
• @SearchableProperty - 指示一个类属性如何被索引,index和store参数类似Lucene。
3、建立LocalCompassBean,配置索引文件存放路径和进行映射的domain。
Xml代码
1. <bean id="compass" class="org.compass.spring.LocalCompassBean">
2. <property name="compassSettings">
3. <props>
4. <!-- 索引文件保存路径 -->
5. <prop key="compass.engine.connection">/home/index/compasstest</prop>
6. </props>
7. </property>
8. <property name="classMappings"> <!-- 进行映射的domain -->
9. <list>
10. <value>ren.domain.User</value>
11. <value>ren.domain.Book</value>
12. </list>
13. </property>
14. </bean>
4、建立SqlMapClientGpsDevice,配置iBatis的sqlMapClient和获取数据进行索引的SQL语句id。
Xml代码
1. <bean id="ibatisGpsDevice" class="org.compass.gps.device.ibatis.SqlMapClientGpsDevice">
2. <property name="name" value="ibatis" />
3. <property name="sqlMapClient">
4. <ref bean="sqlMapClient" /> <!-- 引用项目中已经定义的ibatis的sqlMapClient -->
5. </property>
6. <property name="selectStatementsIds"> <!-- 对这些SQL查询的结果进行索引 -->
7. <list>
8. <value>user.getAllUsers</value>
9. <value>book.getAllBooks</value>
10. </list>
11. </property>
12. </bean>
5、建立CompassGps(SingleCompassGps或DualCompassGps),引用前面的compass和device。
Xml代码
1. <bean id="compassGps" class="org.compass.gps.impl.SingleCompassGps"
2. init-method="start" destroy-method="stop">
3. <property name="compass" ref="compass" />
4. <property name="gpsDevices">
5. <list>
6. <ref local="ibatisGpsDevice"/>
7. </list>
8. </property>
9. </bean>
6、最后,直接调用CompassGps.index()方法建立索引。
Java代码
1. @Component
2. @Qualifier("indexBuilder")
3. public class IndexBuilder {
4.
5. @Autowired
6. @Qualifier("compassGps")
7. private CompassGps compassGps;
8.
9. public void buildIndex() {
10. compassGps.index(); // 一行代码搞定
11. }
12.
13. }
查索引
1、建立CompassTemplate,引用LocalCompassBean。
Xml代码
1. <bean id="compassTemplate" class="org.compass.core.CompassTemplate">
2. <property name="compass">
3. <ref bean="compass" />
4. </property>
5. </bean>
2、使用CompassTemplate.execute(CompassCallback<T>)进行查询。
Java代码
1. @Component
2. @Qualifier("indexSearcher")
3. public class IndexSearcher {
4.
5. @Autowired
6. @Qualifier("compassTemplate")
7. private CompassTemplate compassTemplate;
8.
9. /**
10. * 搜索用户
11. */
12. public List<User> searchUser(final String name, final String gender, final int age) {
13. return compassTemplate.execute(new CompassCallback<List<User>>() {
14. public List<User> doInCompass(CompassSession session) throws CompassException {
15. CompassQueryBuilder builder = session.queryBuilder();
16. String queryString = "";
17. if (!StringUtils.isBlank(name)) {
18. queryString += "and user.name:" + name;
19. }
20. if (!StringUtils.isBlank(gender)) {
21. queryString += "and user.gender:" + gender;
22. }
23. if (age > 0) {
24. queryString += "and user.age:" + age;
25. }
26. CompassQuery query = builder.queryString(queryString).toQuery();
27. query.addSort("user.age", SortPropertyType.INT, SortDirection.REVERSE);
28. CompassHits hits = query.hits();
29. List<User> list = new ArrayList<User>();
30. for (CompassHit hit : hits) {
31. list.add((User)hit.data());
32. }
33. return list;
34. }
35. });
36. }
37.
38. }
拼查询字符串这里写得比较累赘,小朋友不要学~
与Lucene的比较
1、Compass有比Lucene更易用的API(废话,封装了Lucene嘛),例如支持直接更新记录(因为resource类似数据库记录,含有主键)。像上面的建索引过程,如果用Lucene,肯定得写很多Java代码。
2、支持整合各种ORM框架和Spring,减少了代码量。例如上面例子中整合iBatis,直接几行配置就搞定了。
3、效率问题?感觉Lucene的API用起来老是不顺手,Compass这样封装虽然方便了,但有些担心会不会降低了性能,于是做了个简单的测试,分别索引4万条记录,结果是
Compass: 12203 ms.
Lucene: 9797 ms.
Compass比Lucene慢了大约25%,当然这个测试十分粗略,结果仅供参考。
经验总结
1、对多个表建索引后进行搜索,在添加排序条件时,如果不指定SortPropertyType,那么在没有指定converter的字段上排序时会抛Exception:
java.lang.RuntimeException: field "gender" does not appear to be indexed
但如果只对单个表建索引,不会有这个问题。应该是Compass的一个bug,不知道新版本有没有解决。
2、最好自己封装排序字段和分页。
3、总结,Compass比较适用于逻辑不太复杂的应用,会比Lucene少写很多代码。但如果需要一些较为特殊的需求,或者对效率要求比较高,还是用Lucene吧。
分享到:
相关推荐
compass+ibatis+spring+struts2整合开发compass+ibatis+spring+struts2整合开发compass+ibatis+spring+struts2整合开发compass+ibatis+spring+struts2整合开发
《 Compass、Hibernate与Spring的整合应用详解 》 在现代企业级Java开发中,数据持久化是不可或缺的一部分,而Hibernate作为流行的ORM(对象关系映射)框架,极大地简化了数据库操作。然而,对于复杂的搜索需求,...
标题“compass_hibernate_spring3.zip”提示我们这个压缩包可能包含了关于 Compass、Hibernate 和 Spring 3 框架的整合教程或者示例代码。Compass 是一个全文搜索引擎库,它为 Java 应用提供了类似 Google 的搜索...
本文将深入探讨如何将Compass与这三大框架整合,以实现高效、灵活的全站搜索功能。 一、Compass简介 Compass的核心功能是提供了一个简单易用的API,使得开发者能够方便地在数据库中的对象上添加全文索引。它支持...
标题“compass_hibernate_spring2.zip”提示我们这个压缩包可能包含了关于 Compass、Hibernate 和 Spring 三者结合使用的示例或教程。Compass 是一个全文搜索引擎,Hibernate 是一个流行的 Java ORM(对象关系映射)...
### 基于Compass2.2与Spring结合建立索引的实例 #### 一、Compass简介 Compass是一个开源的.NET和Java框架,它为应用程序提供了完整的文本搜索功能。该框架支持多种搜索引擎(如Elasticsearch, Solr等),使得开发...
标题 "整合compass2.0 spring hibernate示例源程序" 提供了我们即将探讨的核心内容,即一个结合了Compass 2.0、Spring和Hibernate的集成示例。这个项目旨在展示如何在Java应用程序中有效地利用这三个强大的开源框架...
根据描述,本文档还涵盖了Compass的实际搭建过程,尽管具体步骤未完全展示,但可以推测包括了环境配置、依赖库添加、配置文件编写、Annotation使用以及与Spring框架的整合等环节。 #### 结论 Compass作为一款成熟...
1. **ORM集成**:Compass可以与流行的ORM框架如Hibernate、JPA、iBatis等进行集成,自动将数据库中的对象创建成索引,无需手动处理索引的创建和维护。 2. **动态索引更新**:当数据库中的数据发生变化时,Compass...
这篇博客文章“Compass与ssh框架整合”将深入探讨如何将Compass集成到SSH框架中,以实现更高效的数据检索。 首先,我们需要理解SSH框架的核心组件: 1. **Spring**:是一个全面的开源应用框架,提供了依赖注入(DI...
在本项目中,"JAVA 全文搜索 struts2+spring+hibernate+compass整合记录" 是一个关于如何在Java环境下集成四个关键组件来实现全文搜索引擎的实践教程。Struts2是一个流行的MVC框架,Spring是核心的依赖注入框架,...
下面将详细讲解Compass的基本概念、安装过程、主要功能以及如何通过它来构建入门级的网页项目。 一、Compass简介 Compass是一个开源项目,由Chris Eppstein开发,它的核心思想是提供一系列预先定义好的样式库和模块...
标题提及的"COMPASS+spring构建自己的搜索引擎"是关于如何使用Compass搜索引擎框架与Spring框架集成,构建一个自定义的全文搜索引擎。Compass是一个开源的搜索引擎库,它提供了与ORM框架(如Hibernate)的集成,使得...
接下来,我们将深入探讨这些技术及其整合。 **1. Compass:** Compass 是一个基于 Lucene 的搜索引擎库,为 Java 应用提供了简单易用的全文搜索功能。它允许开发者将元数据(如注解)与类关联,以便在数据库中进行...
标题 "Spring ,JPA,Compass使用注解开发的博客站内搜索" 涉及的是在Java开发环境中,利用Spring框架、Java Persistence API (JPA) 和 Compass搜索引擎来实现一个博客系统的站内搜索功能。这是一项关键的技术,因为...
这个实例"STRUTS SPRING COMPASS"将这四个组件集成在一起,构建了一个完整的Java企业级应用解决方案。 首先,让我们详细了解一下这些框架的核心概念: 1. **STRUTS**:Struts是一个基于MVC设计模式的Java Web框架...
标题中的“Lucene+compass+spring+jdbc+庖丁的一个例子”揭示了这是一个关于整合多个技术来构建一个搜索系统的示例。在这个系统中,我们有以下几个关键组件: 1. **Lucene**: Apache Lucene 是一个高性能、全文本...
总结来说,这个项目展示了如何通过整合Struts2、Hibernate、Spring和Compass,构建一个具备全文检索功能的Java Web应用。这样的架构不仅实现了业务逻辑和数据访问的解耦,还提高了数据查询的性能,为用户提供了一种...