Compass是一个封装了Lucene的框架。使用Compass的API可以非常方便地建立索引、删除索引、实现检索。Compass非常像Hibernate,Compass封装了Lucene就像Hibernate封装了JDBC操作一样,通过简单的API就能实现底层的操作。
但是,初次接触Compass,并不像想象的那样,我想,在以后的不断学习中,会一点点地深入理解Compass的更多内容。
感觉,如果不真正地实现一个Compass的例子,即使是非常简单的例子,我的印象中的Compass还是很模糊的。就拿一个最简单的例子来展示一下Compass到底能够做到什么,有了这样一种直观的印象,才能与Compass拉近距离,便于深入学习。
新建一个Java Project,作为测试的工程。
Compass版本
Compass 1.2
工程结构
实现Compass的例子的工程结构如下所示:
Compass
│ .classpath
│ .project
│
├─bin
│ └─org
│ └─shirdrn
│ └─compass
│ │ compass.cfg.xml
│ │
│ ├─document
│ │ alias.cmd.xml
│ │ Book.class
│ │ Book.cpm.xml
│ │
│ └─main
│ MyCompass.class
│
├─src
│ └─org
│ └─shirdrn
│ └─compass
│ │ compass.cfg.xml
│ │
│ ├─document
│ │ alias.cmd.xml
│ │ Book.cpm.xml
│ │ Book.java
│ │
│ └─main
│ MyCompass.java
│
└─target
└─index
└─index
└─book
segments.gen
segments_5
_0.cfs
_0_1.del
_1.cfs
_1_1.del
_2.cfs
_3.cfs
上面的红色部分(即target所在目录分支)是在运行程序的时候才生成的,在目录/target/index/index/book/下面生成的就是索引文件。这些文件的格式,在Lucene中已经非常熟悉了。
开发过程
需要用到的jar包,通过工程的classpath文件可以看到都用到了哪些jar包,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="lib" path="E:/JAR包/Compass 1.2/compass.jar"/>
<classpathentry kind="lib" path="E:/JAR包/Others/log4j-1.2.11.jar"/>
<classpathentry kind="lib" path="E:/Compass/compass-1.2-with-dependencies/compass-1.2/lib/lucene/lucene-core.jar"/>
<classpathentry kind="lib" path="E:/Compass/compass-1.2-with-dependencies/compass-1.2/lib/lucene/lucene-highlighter.jar"/>
<classpathentry kind="lib" path="E:/Compass/compass-1.2-with-dependencies/compass-1.2/lib/lucene/lucene-queries.jar"/>
<classpathentry kind="lib" path="E:/Compass/compass-1.2-with-dependencies/compass-1.2/lib/lucene/lucene-snowball.jar"/>
<classpathentry kind="lib" path="E:/Compass/compass-1.2-with-dependencies/compass-1.2/lib/lucene/lucene-analyzers.jar"/>
<classpathentry kind="lib" path="E:/Compass/compass-1.2-with-dependencies/compass-1.2/lib/log4j/log4j-1.2.13.jar"/>
<classpathentry kind="lib" path="E:/Compass/compass-1.2-with-dependencies/compass-1.2/dist/commons-logging.jar"/>
<classpathentry kind="output" path="bin"/>
</classpath>
看看Compass的配置文件compass.cfg.xml是如何配置的:
<!DOCTYPE compass-core-configuration PUBLIC
"-//Compass/Compass Core Configuration DTD 1.0//EN"
"http://www.opensymphony.com/compass/dtd/compass-core-configuration.dtd">
<compass-core-configuration>
<compass>
<setting name="compass.engine.connection">target/index</setting>
<meta-data
resource="org/shirdrn/compass/document/alias.cmd.xml" />
</compass>
</compass-core-configuration>
很像Hibernate的配置文件。
setting元素中配置了索引文件的存放位置,上面为target/index,即在当前工程目录下,生成的索引文件会存放在target/index/index/目录下。
meta-data元素通过指定属性resource的值,即一个包含完整包名的alias(别名)定义文件。alias.cmd.xml文件中包含的内容是一个实体类的相关信息,如下所示:
<?xml version="1.0"?>
<!DOCTYPE compass-core-meta-data PUBLIC
"-//Compass/Compass Core Meta Data DTD 1.0//EN"
"http://www.opensymphony.com/compass/dtd/compass-core-meta-data.dtd">
<compass-core-meta-data>
<meta-data-group id="mybooks" displayName="Mybooks Meta Data">
<description>Book Meta Data</description>
<uri>http://compass/mybooks</uri>
<alias id="book" displayName="Book">
<description>Book alias</description>
<uri>http://compass/mybooks/Book</uri>
<name>book</name>
</alias>
<meta-data id="bookNo" displayName="BookNo">
<description>Author alias</description>
<uri>http://compass/mybooks/bookNo</uri>
<name>bookNo</name>
</meta-data>
<meta-data id="bookName" displayName="BookName">
<description>BookName alias</description>
<uri>http://compass/mybooks/bookName</uri>
<name>bookName</name>
</meta-data>
<meta-data id="author" displayName="Author">
<description>Text alias</description>
<uri>http://compass/mybooks/author</uri>
<name>author</name>
</meta-data>
<meta-data id="category" displayName="Category">
<description>Category alias</description>
<uri>http://compass/mybooks/category</uri>
<name>category</name>
</meta-data>
<meta-data id="contents" displayName="Contents">
<description>Text alias</description>
<uri>http://compass/mybooks/contents</uri>
<name>contents</name>
</meta-data>
<meta-data id="price" displayName="Price">
<description>Price alias</description>
<uri>http://compass/mybooks/price</uri>
<name>price</name>
</meta-data>
</meta-data-group>
</compass-core-meta-data>
该文件中meta-data-group元素的id属性值标识了一个组id,通过它可以设置一个实体类的每个属性的元数据(meta-data),在后面的实体(Book)的映射文件中可以看到。
在Compass中,实体类对应于Lucene中的Document,就像Hibernate中的POJO对应于数据库中的表一样,是这样的一种映射的关系。
为了测试,只建立一个实体类Book类,就是一个JavaBean,Book。Book.java的代码如下所示:
package org.shirdrn.compass.document;
public class Book {
private String bookNo;
private String bookName;
private String author;
private String category;
private String contents;
private Double price;
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
public String getContents() {
return contents;
}
public void setContents(String contents) {
this.contents = contents;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
public String getBookNo() {
return bookNo;
}
public void setBookNo(String bookNo) {
this.bookNo = bookNo;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
}
其中,在Book.java中定义了几个属性,这些属性对应于Lucene中的Field。
一个实体类对应着一个映射文件,比如Book类对应的映射文件名称为Book.cpm.xml,配置如下所示:
<?xml version="1.0"?>
<!DOCTYPE compass-core-mapping PUBLIC
"-//Compass/Compass Core Mapping DTD 1.0//EN"
"http://www.opensymphony.com/compass/dtd/compass-core-mapping.dtd">
<compass-core-mapping package="org.shirdrn.compass.document">
<class name="Book" alias="${mybooks.book}">
<id name="bookNo" />
<property name="bookName">
<meta-data>${mybooks.bookName}</meta-data>
</property>
<property name="author">
<meta-data>${mybooks.author}</meta-data>
</property>
<property name="category">
<meta-data>${mybooks.category}</meta-data>
</property>
<property name="contents">
<meta-data>${mybooks.contents}</meta-data>
</property>
<property name="price">
<meta-data>${mybooks.price}</meta-data>
</property>
</class>
</compass-core-mapping>
通过使用alias.cmd.xml文件中的meta-data-group id="mybooks"来设置一个实体的属性,使用${}来设置。
其中,id唯一地标识了一个Book对象,可以对其执行save、delete操作,其实就是在对一个Document进行上述操作。
编写一个测试类MyCompass类,如下所示:
package org.shirdrn.compass.main;
import org.compass.core.Compass;
import org.compass.core.CompassHits;
import org.compass.core.CompassSession;
import org.compass.core.CompassTransaction;
import org.compass.core.config.CompassConfiguration;
import org.shirdrn.compass.document.Book;
public class MyCompass {
private static Compass compass;
static{ // 解析Compass配置文件,加载Book实体类
CompassConfiguration config = new CompassConfiguration();
config.configure("/org/shirdrn/compass/compass.cfg.xml");
config.addClass(Book.class);
compass = config.buildCompass();
}
private Book addBookA(){ // 构造一个Book实例,实际上是构造了一个Document,并向其中添加Field
Book book = new Book();
book.setBookNo("ISBN 987-5-624-16000-8/TP");
book.setBookName("Compass框架技术");
book.setAuthor("飞云居士");
book.setCategory("Java");
String contents = "Compass是封装了Lucene的一个功能强大的框架。"+
"Compass简单易学,这使得开发者可以像使用Hibernate一样轻松地开发自己的搜索引擎。"+
"即使对Lucene并不是很熟悉,使用Compass框架开发使你变得游刃有余。";
book.setContents(contents);
book.setPrice(new Double(23.00));
return book;
}
private Book addBookB(){
Book book = new Book();
book.setBookNo("ISBN 388-2-244-16000-9/TP");
book.setBookName("鬼吹灯");
book.setAuthor("本物天下霸唱");
book.setCategory("考古小说类");
String contents = "几位“摸金校尉”(盗墓贼)通过风水秘术在发掘古墓时的诡异经历。"+
"主人公胡八一祖传的风水秘书残卷,上山下乡时误入大山深处的辽代古墓,"+
"参军时在昆仑山大冰川发现的九层妖楼,东北中蒙边境的关东军秘密地下...";
book.setContents(contents);
book.setPrice(new Double(58.50));
return book;
}
private void createIndex(Book book) { // 建立索引,与Hibernate很相似
CompassSession session = compass.openSession();
CompassTransaction tx = session.beginTransaction();
session.save(book);
tx.commit();
session.close();
}
private void search(String keyword) { // 根据关键字keyword检索
CompassSession session = compass.openSession();
CompassTransaction tx = session.beginTransaction();
CompassHits hits = session.find(keyword);
System.out.println("检索关键字 "+keyword+" 的检索结果如下:");
System.out.println("********************************************");
for (int i = 0; i < hits.getLength(); i++) {
Book book = (Book)hits.data(i);
System.out.println("书的编号为: "+book.getBookNo());
System.out.println("书的名称为: "+book.getBookName());
System.out.println("书的作者为: "+book.getAuthor());
System.out.println("书的类别为: "+book.getCategory());
System.out.println("书的内容为: "+book.getContents());
System.out.println("书的定价为: "+book.getPrice());
System.out.println("********************************************");
}
System.out.println("共检索出结果 "+hits.length()+" 个。");
hits.close();
tx.commit();
session.close();
compass.close();
}
public static void main(String[] args) {
MyCompass myCompass = new MyCompass();
myCompass.createIndex(myCompass.addBookA());
myCompass.createIndex(myCompass.addBookB());
myCompass.search("鬼吹灯");
}
}
通过两个方法:addBookA()和addBookB()构造两个Book实例,要为它们建立索引。
当执行上面测试函数的时候,会在工程目录下生成如下索引目录:
\target\index\index\book\
在索引目录下生成建立的索引文件。
通过Book的bookName来检索,检索关键字“鬼吹灯”,运行结果如下所示:
检索关键字 鬼吹灯 的检索结果如下:
********************************************
书的编号为: ISBN 388-2-244-16000-9/TP
书的名称为: 鬼吹灯
书的作者为: 本物天下霸唱
书的类别为: 考古小说类
书的内容为: 几位“摸金校尉”(盗墓贼)通过风水秘术在发掘古墓时的诡异经历。主人公胡八一祖传的风水秘书残卷,上山下乡时误入大山深处的辽代古墓,参军时在昆仑山大冰川发现的九层妖楼,东北中蒙边境的关东军秘密地下...
书的定价为: 58.5
********************************************
共检索出结果 1 个。
如果想要通过文章中词条作为关键字来检索,也一样,比如检索关键字“的”,因为它在两个Book的内容中都出现了,预测应该能检索出两个Book。
看运行结果,如下所示:
检索关键字 的 的检索结果如下:
********************************************
书的编号为: ISBN 388-2-244-16000-9/TP
书的名称为: 鬼吹灯
书的作者为: 本物天下霸唱
书的类别为: 考古小说类
书的内容为: 几位“摸金校尉”(盗墓贼)通过风水秘术在发掘古墓时的诡异经历。主人公胡八一祖传的风水秘书残卷,上山下乡时误入大山深处的辽代古墓,参军时在昆仑山大冰川发现的九层妖楼,东北中蒙边境的关东军秘密地下...
书的定价为: 58.5
********************************************
书的编号为: ISBN 987-5-624-16000-8/TP
书的名称为: Compass框架技术
书的作者为: 飞云居士
书的类别为: Java
书的内容为: Compass是封装了Lucene的一个功能强大的框架。Compass简单易学,这使得开发者可以像使用Hibernate一样轻松地开发自己的搜索引擎。即使对Lucene并不是很熟悉,使用Compass框架开发使你变得游刃有余。
书的定价为: 23.0
********************************************
共检索出结果 2 个。
修改和删除索引,需要通过一个实体类对象的唯一标识来定位该索引文件,然后对其删除或者修改,比如上面的Book中bookNo就可以标识一个Book对象,通过指定一个bookNo,通过CompassSession的delete方法进行删除。
删除索引的操作也是非常简单的,如下所示:
private void deleteIndex(Book book) { // 删除索引,与Hibernate很相似
CompassSession session = compass.openSession();
CompassTransaction tx = session.beginTransaction();
session.delete(book);
tx.commit();
session.close();
}
修改索引与Hibernate稍有不同,实际上是先把原来已经存在的索引删除掉,之后再重新创建索引,如下所示:
private void updateIndex(Book book) { // 修改索引
CompassSession session = compass.openSession();
CompassTransaction tx = session.beginTransaction();
session.delete(book);
session.save(book);
tx.commit();
session.close();
}
上面实现这个例子是最最基础的,供参考以入门。
相关推荐
标题 "compass2简单例子" 指向的是一个关于 Compass 的使用教程,Compass 是一个基于 Sass 的 CSS 预处理器。它简化了编写复杂的 CSS3 规则,并提供了易于管理的项目结构。这个简单的例子可能包括如何设置 Compass、...
在本文档中,我们将探讨如何使用Compass和Lucene这两个工具来实现一个简单的全文检索功能。Compass是一个基于Lucene的开源搜索引擎框架,它简化了将Lucene集成到Java应用程序中的过程,特别是与ORM框架(如Hibernate...
Compass 是一个全文搜索引擎库,它是对 Lucene 的封装,为 Java 应用提供了一种简单易用的接口。在 Compass 中,Annotation 是一种元数据注解方式,它允许开发者在对象模型上直接定义搜索映射,使得对象与索引之间的...
Compass是一个强大的,事务的,高性能的对象/搜索引擎映射(OSEM:object/search engine mapping)与一个Java持久层框架.Compass包括: * 搜索引擎抽象层(使用Lucene搜索引荐), * OSEM (Object/Search Engine Mapping) ...
本文将介绍Compass,一个基于Lucene的全文搜索引擎库,为Java开发者提供了一种简单易用的方式来集成全文检索功能。Compass不仅提供了与ORM框架(如Hibernate、JPA等)的无缝集成,还支持动态索引更新,使得实时数据...
在本文档的第一部分,展示了`ProjectApply`类的定义,这是一个简单的POJO(Plain Old Java Object)类,用于表示项目申请的信息。 ```java package com.cgb.ky.resources.model; public class ProjectApply ...
标题中的“Lucene+compass+spring+jdbc+庖丁的一个例子”揭示了这是一个关于整合多个技术来构建一个搜索系统的示例。在这个系统中,我们有以下几个关键组件: 1. **Lucene**: Apache Lucene 是一个高性能、全文本...
接下来,你需要创建一个Compass实例,并配置相应的存储源(如内存、文件系统或数据库)。存储源决定了索引数据的存储位置。例如,如果选择文件系统作为存储源,可以指定一个目录来保存索引文件。 然后,定义你的...
"mongodb-compass-1.27.1-win32-x64.zip"是一个针对Windows 64位系统的MongoDB Compass版本的压缩包。 MongoDB Compass的核心功能包括: 1. **数据可视化**:它提供了一个直观的界面来查看和理解数据库的结构,...
而Compass则是一个基于Lucene的搜索引擎框架,它为Lucene提供了更高级别的抽象和更方便的使用方式,让开发更加高效便捷。 Lucene的核心功能包括文档的索引和查询。在示例中,`lucene.html`展示了一个简单的HTML表单...
Compass是一个基于Apache Lucene的全文搜索引擎库,它提供了一种简单的方式来连接到应用程序的数据源,并将其索引到Lucene中。Compass的主要优势在于它能够透明地集成到现有应用中,使得开发者无需对原有代码进行大...
SSH2+Compass2.2搜索实例是一个基于Java Web开发的综合项目,它结合了Struts2.2.3、Spring 3.0.6、Hibernate3.6以及Compass2.2这四个核心技术,旨在提供一个高效且灵活的搜索功能。这个完整的工程是一个很好的学习...
综上所述,Compass不仅是一个简单的搜索库,而是包含了广泛的功能和深度的定制选项,旨在满足不同规模和复杂度项目的需求。通过深入理解其架构和特性,开发者可以有效地利用Compass构建高性能的搜索解决方案。
例如,在Spring环境中,可以通过以下代码轻松保存一个实体: ```java CompassTemplate ct = (CompassTemplate) context.getBean("compassTemplate"); Article article = new Article(); article.setTitle("Compass ...
安装"mongodb-compass-community-1.12.8-win32-x64.exe"后,用户可以通过简单的步骤连接到本地或远程MongoDB实例,开始使用上述功能。值得注意的是,虽然社区版提供许多基础功能,但更高级的特性,如安全审计和高级...
Compass是基于Java的一个全文搜索引擎库,它为Java应用程序提供了与Lucene搜索引擎库的无缝集成。在SSH(Spring、Struts和Hibernate)框架中集成Compass插件,可以帮助开发者轻松实现数据的全文检索功能,提高应用的...
这个实例虽然可能不够完善,但作为一个学习和实践的过程,对于理解SSH2和Compass的整合以及搜索引擎在实际项目中的应用是非常有价值的。在实际项目中,可以根据具体需求进一步优化配置和代码,提升整体性能和用户...
以下是一个简单的Compass应用示例,展示如何创建一个居中且有圆角的按钮: ```scss // 导入必要的Compass模块 @import "compass"; // 定义一个按钮混合 @mixin button($bg-color, $text-color) { background: $bg...