compass 简单教程
来源:互联网 发布:nba2k14优化伴侣 编辑:程序博客网 时间:2024/06/05 04:16
Compass 下简化的索引建立过程 在lucene 下建立索引的过程是自己用JDBC 跑SQL 获得ResultSet,遍历ResultSet建立Document对象并用IndexWriter写入文件目录。
在Compass下就变成一个宣告的过程:
3.1 宣告待搜索的POJO
@SearchableId 宣告Document的id列;
@SearchableProperty 宣告要索引的field;
@SearchableComponent宣告关联其他对象如Category分类。
public class Product {
@SearchableId
private Integer id;
@SearchableProperty
private String name;
@SearchableComponent
private Category category;
}
3.2 定义CompassGps
CompassGps是Compass下用来建立索引,Mirror Data Change的类。
在ApplicationContext.xml定义了Compass与Spring的集成,配置参数,并让GPS随ApplicationContext启动开始监控Hibernate的DataChange :
* Compass:核心定义类,定义要搜索的POJO 和 索引存储的路径。
* CompassGPS: 定义使用了Hibernate3GPS,定义了init-method 和destory-method,会自动随ApplicaitonContext的启动,开始监控Hibernate的变化。
<bean id="compass" class="org.compass.spring.LocalCompassBean">
<!-- anontaition式设置 -->
<property name="classMappings">
<list>
<value>org.springside.bookstore.model.Book</value>
<value>org.springside.bookstore.model.Category</value>
</list>
</property>
<property name="compassConfiguration">
<bean class="org.compass.annotations.config.CompassAnnotationsConfiguration"/>
</property>
<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 name="transactionManager" ref="transactionManager"/>
</bean>
<!-- Compass中建立索引与mirror database change的部件 -->
<bean id="compassGps" class="org.compass.gps.impl.SingleCompassGps"
init-method="start" destroy-method="stop">
<property name="compass" ref="compass"/>
<property name="gpsDevices">
<list>
<bean class="org.compass.spring.device.hibernate.SpringHibernate3GpsDevice">
<property name="name" value="hibernateDevice"/>
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
</list>
</property>
</bean>
只需要在AdvancedSearchCommand 上将需要highlighting 的Fields 加入即可。
searchCommand.setHighlightFields(new String[] {"name"});
4.2 定义高亮的样式
另外,如果对高亮显示的效果不满意的话,可以在applicationContext-compass.xml 文件里配置:
<prop key="compass.engine.highlighter.default.formatter.simple.pre">
<![CDATA[<font color="red"><b>]]>
</prop>
<prop key="compass.engine.highlighter.default.formatter.simple.post">
<![CDATA[</b></font>]]>
</prop>
编写一个测试类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();
}
在Compass下就变成一个宣告的过程:
3.1 宣告待搜索的POJO
@SearchableId 宣告Document的id列;
@SearchableProperty 宣告要索引的field;
@SearchableComponent宣告关联其他对象如Category分类。
public class Product {
@SearchableId
private Integer id;
@SearchableProperty
private String name;
@SearchableComponent
private Category category;
}
3.2 定义CompassGps
CompassGps是Compass下用来建立索引,Mirror Data Change的类。
在ApplicationContext.xml定义了Compass与Spring的集成,配置参数,并让GPS随ApplicationContext启动开始监控Hibernate的DataChange :
* Compass:核心定义类,定义要搜索的POJO 和 索引存储的路径。
* CompassGPS: 定义使用了Hibernate3GPS,定义了init-method 和destory-method,会自动随ApplicaitonContext的启动,开始监控Hibernate的变化。
<bean id="compass" class="org.compass.spring.LocalCompassBean">
<!-- anontaition式设置 -->
<property name="classMappings">
<list>
<value>org.springside.bookstore.model.Book</value>
<value>org.springside.bookstore.model.Category</value>
</list>
</property>
<property name="compassConfiguration">
<bean class="org.compass.annotations.config.CompassAnnotationsConfiguration"/>
</property>
<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 name="transactionManager" ref="transactionManager"/>
</bean>
<!-- Compass中建立索引与mirror database change的部件 -->
<bean id="compassGps" class="org.compass.gps.impl.SingleCompassGps"
init-method="start" destroy-method="stop">
<property name="compass" ref="compass"/>
<property name="gpsDevices">
<list>
<bean class="org.compass.spring.device.hibernate.SpringHibernate3GpsDevice">
<property name="name" value="hibernateDevice"/>
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
</list>
</property>
</bean>
只需要在AdvancedSearchCommand 上将需要highlighting 的Fields 加入即可。
searchCommand.setHighlightFields(new String[] {"name"});
4.2 定义高亮的样式
另外,如果对高亮显示的效果不满意的话,可以在applicationContext-compass.xml 文件里配置:
<prop key="compass.engine.highlighter.default.formatter.simple.pre">
<![CDATA[<font color="red"><b>]]>
</prop>
<prop key="compass.engine.highlighter.default.formatter.simple.post">
<![CDATA[</b></font>]]>
</prop>
编写一个测试类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);
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很相似
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);
session.close();
}
- compass 简单教程
- sass与compass简单教程
- sass与compass简单教程
- compass简单配置
- Compass简单入门
- Compass的一个简单例子
- 一个简单的自定义Compass
- Compass
- Compass
- Compass
- Compass
- Compass
- Compass
- Compass
- 利用Compass实现一个简单的搜索引擎
- 利用Compass实现一个简单的搜索引擎
- 利用Compass实现一个简单的搜索引擎
- 简单的lucene框架 Compass 的使用
- 【麻辣烫】
- compass指南针搜索框架学习(二)
- 使用iOS手势UIGestureRecognizer
- 用QextSerialPort库,获取系统当前可用串口信息的方法
- android App 缓存管理
- compass 简单教程
- linux 获取exe的路径
- 统计学习-1
- UniDAC使用日记
- 【孩子分糖 Candy problems】可行解3-leecode-OJ
- Android数据库(SQLiteDatabase)使用小结 .
- 初探js特效魅力之定时器的使用one
- const的作用
- ALAsset和ALAssetRepresentation详解