以下是鄙人在学习compass所做的笔记(如果鄙人写的不是很清楚的话,可以从电驴或者迅雷上搜索v521刘伟老师的compass学习视频)。系统框架采用Struts2.1.6+Spring2.5.4+Hibernate3+compass2.1.0,JDK版本采用6.0的。
首先,需要将将SSH整合好。具体的我不在此说明,可以在google上进行搜索。我将重点说明compass如何与SSH进行整合。
使用compass框架,首先需要进行compass关于实体类的映射。compass在其文档中说明,一般是在实体类相对应的*.cpm.xml中进行配置的。但是在开发中,我们可以借助jdk关于标注的新特性,将此文件省略。具体代码如下所示:
package com.zhou.model;
import java.io.Serializable;
import org.compass.annotations.Searchable;
import org.compass.annotations.SearchableId;
import org.compass.annotations.SearchableProperty;
@Searchable
public class Product implements Serializable {
private static final long serialVersionUID = -3148838659193709682L;
//Field
@SearchableId
private String id;
@SearchableProperty(name="name")
private String name;
@SearchableProperty(name="price")
private Integer price;
@SearchableProperty(name="brand")
private String brand;
@SearchableProperty(name="description")
private String description;
// Constructors
/** default constructor */
public Product() {
}
/** full constructor */
public Product(String name, Integer price, String brand, String description) {
this.name = name;
this.price = price;
this.brand = brand;
this.description = description;
}
// Property accessors
public String getId() {
return this.id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public Integer getPrice() {
return this.price;
}
public void setPrice(Integer price) {
this.price = price;
}
public String getBrand() {
return this.brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public String getDescription() {
return this.description;
}
public void setDescription(String description) {
this.description = description;
}
}
如代码所示,实体类的类声明和属性声明分别加入了相应的标注。public class前面的“@Searchable”表示此类可以被索引,也就是此类对应的数据库可以被索引。属性id前的“@SearchableId”表示索引建立的id。其他属性前面的“@SearchableProperty(name="name")”表示此字段可以被索引、被检索。name=“name”表示此字段被索引后的名称。在检索类中,可以根据此名字指定搜索的字段名称。
建立索引的类(CompassIndexBuilder.java)
package com.zhou.service.impl;
import java.util.Date;
import org.compass.gps.CompassGps;
import org.springframework.beans.factory.InitializingBean;
public class CompassIndexBuilder implements InitializingBean {
private boolean buildIndex = false;
private int lazyTime = 5;
private CompassGps compassGps;
private Thread indexThread = new Thread() {
public void run() {
try {
Thread.sleep(lazyTime * 1000);
System.out.println("begin compass index...");
long beginTime = System.currentTimeMillis();
compassGps.index();
long costTime = System.currentTimeMillis() - beginTime;
System.out.println("compss index finished.");
System.out.println("costed " + costTime + " milliseconds");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
public void afterPropertiesSet() throws Exception {
System.out.println(new Date()+"调用");
if (buildIndex) {
indexThread.setDaemon(true);
indexThread.setName("Compass Indexer");
indexThread.start();
}
}
public void setBuildIndex(boolean buildIndex) {
this.buildIndex = buildIndex;
}
public void setLazyTime(int lazyTime) {
this.lazyTime = lazyTime;
}
public void setCompassGps(CompassGps compassGps) {
this.compassGps = compassGps;
}
}
详细的解释可以观看视频,在此不再说明。
将compass的配置写在同一个文件(applicationContext-compass)中,以便同一管理。内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"
default-lazy-init="true">
<!-- 如果使用jdk标注新特性,此处必须有的 -->
<bean id="annotationConfiguration" class="org.compass.annotations.config.CompassAnnotationsConfiguration">
</bean>
<bean id="compass" class="org.compass.spring.LocalCompassBean">
<property name="resourceDirectoryLocations">
<list>
<value>classpath:com/zhou</value>
</list>
</property>
<property name="connection">
<value>/lucene/indexes</value>
</property>
<property name="classMappings">
<list>
<value>com.zhou.model.Product</value>
</list>
</property>
<property name="compassConfiguration"
ref="annotationConfiguration" />
<property name="compassSettings">
<props>
<prop key="compass.transaction.factory">
org.compass.spring.transaction.SpringSyncTransactionFactory
</prop>
<prop
key="compass.engine.analyzer.MMAnalyzer.CustomAnalyzer">
net.paoding.analysis.analyzer.PaodingAnalyzer
</prop>
<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>
</props>
</property>
<property name="transactionManager" ref="transactionManager" />
</bean>
<bean id="hibernateGpsDevice"
class="org.compass.gps.device.hibernate.HibernateGpsDevice">
<property name="name">
<value>hibernateDevice</value>
</property>
<property name="sessionFactory" ref="sessionFactory" />
<property name="mirrorDataChanges">
<value>true</value>
</property>
</bean>
<!-- 同步更新索引 -->
<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.SpringSyncTransactionGpsDeviceWrapper">
<property name="gpsDevice" ref="hibernateGpsDevice" />
</bean>
</list>
</property>
</bean>
<bean id="compassTemplate"
class="org.compass.core.CompassTemplate">
<property name="compass" ref="compass" />
</bean>
<!-- 定时重建索引(利用quartz)或随Spring ApplicationContext启动而重建索引 -->
<bean id="compassIndexBuilder"
class="com.zhou.service.impl.CompassIndexBuilder" lazy-init="false">
<property name="compassGps" ref="compassGps" />
<property name="buildIndex" value="true" />
<property name="lazyTime" value="5" />
</bean>
</beans>
在业务层进行数据检索的代码如下:
public List<Product> searchProducts(String queryString) {
List<Product> products = new ArrayList<Product>();
Compass compass = compassTemplate.getCompass();
CompassSession session = compass.openSession();
CompassHits hits = session.queryBuilder().queryString(
"name:" + queryString).toQuery().hits();
System.out.println("---------------------------------------------");
System.out.println("queryString=" + queryString);
System.out.println("结果个数=" + hits.length());
for (int i = 0; i < hits.length(); i++) {
Product hit = (Product) hits.data(i);
String ht = hits.highlighter(i).fragment("name");
if (null != ht) {
hit.setName(ht);
}
products.add(hit);
}
return products;
}
以上是关键部分的说明。在bs层中的检索方法searchProducts(String queryString)中,有很多地方需要深入的思考一下。比如:在“CompassHits hits = session.queryBuilder().queryString("name:" + queryString).toQuery().hits();”中的“name”就是至前面实体类中的“@SearchableProperty(name="name")”中“name”的值,表示只对该字段进行检索。又比如涉及到结果分页显示的话,该如何封装返回的结果。究竟是一次全部封装到List中还是每页显示n条就封装n条,翻页的时候继续hit呢?有待深入思考。
附件为样例程序,但是相关的jar包太大了,无法上传!需要自己查找。
分享到:
相关推荐
Compass原理深入学习笔记,对于compass知识的一个梳理,希望对大家有用
spring+hibernate+jpa+struts1+struts2+springmvc+jquery+freemaker 学习笔记 Compass将lucene、Spring、Hibernate三者结合
ros_naviagtion_study ros navigation原始代码注释,用于记录个人学习源码的笔记,如果想使用原始代码,请到ros wiki中下载,这里只是学习笔记。
SSM实战项目——Java高并发秒杀API本文包括了项目的完整流程+开发过程中遇到的各种坑的总结+学习笔记和问题扩展,如果觉得README太长,我在blog里进行了分章,这是完成后的项目,(阿里云到期了orz)项目截图秒杀列表...
OpenGL_Learning 通过学习OpenGL教程——ogldev,自己实现数学库,一步步学习OpenGL 每一子文件夹对应一小节,并且子文件夹中有markdown的学习笔记
机器学习环境设置如何在PC或笔记本电脑中设置机器学习环境? 如何安装机器学习库? 您所有的问题都在这里回答!!!要求的Python 3.5 PyCharm或CMD(管理员模式) 网络连接如何 ? 使用Pip命令安装所有机器学习库。...
基本的JAVA理解学习笔记 细绳 String st = " " ; String st = new String ( " " ); # use ' new ' to make an object st1.equals(st2) :比较字符串st1,st2是否相同 st1.indexOf(st2) :提取特定部分的起始索引...
windysong.notebook bf.w 个人使用的笔记本 为了方便自己学习,开发的.net core练手笔记记录程序 2017/12/29 初始化项目 后台地址: /Admin 默认帐号:bf.w 默认密码:888888 Demo:
:compass: 开源项目的创始人 :deer: GitAwards Jupyter笔记本电脑名 自加入Github以来,我推动了2074次提交,发布了86个问题,在55个个人项目中获得了13019个星级,并为27个公共存储库做出了贡献。 配套 此处列出...
我的自学笔记,在学习MLSys和C ++,整理算法,操作系统,后续学习分布式系统,终身更新。 我不是贵系oi出身的大神,目前在以一个初学者的心态补习计算机知识,学习路径和心得可能更值得大家在一起。 欢迎交流任何...
机器学习数学该存储库包含掌握机器学习所需的代码和数学概念理论。 该存储库将为机器学习的任何初学者提供扎实的基础,以学习线性代数和多元微积分的重要概念。我包括了具有代码段和重要说明的IPython笔记本。 所以...
随着物联网和其他移动设备的快速发展,更快,更高效的深度学习技术的部署需要更多的努力。 我创建了这个资料库,以探索和开发最新的加速计算和有效的深度学习技术,以进行更快的序列建模。 我们选择的基础库是 ,它...
笔记: 在所有迁移完成之后但在部署/运行应用程序之前,始终根据提供的屏幕快照创建所需的组。 base.html中的[removed][removed]标记不适用于college_base.html ,反之亦然。 请忽略project_report文件夹 使用...
适用于Android和iOS的Yolo-实时移动深度学习对象检测 该存储库包含适用于Android和iOS的(Tiny)Yolo V1对象检测器的实现。 olo啦 Yolo的创建者自己的Ted Talk本身给出了一个很好的高级概述: 。 您还应该查看他的...
因此,我们创建了一个应用程序,该应用程序使用机器学习和自然语言处理从笔记中生成抽认卡,测验和摘要! 此外,我们提供三种类型的问题:MCQ,填空以及对或错问题以测试您的笔记。 您还可以上传手写笔记以生成测验...
电影推荐引擎 一种简单的算法,可帮助您获取以前看过的电影的电影推荐。 它是如何工作的? 它从用户那里获得电影作为输入,然后...Scikit学习 Wget 使用的工具----> Google Colab Jupyter笔记本 用python制成:)
:spiral_notepad: -具有“无网络”共享功能的“无云”笔记应用程序。 :man::laptop: 程序员的学习途径 用代码 :heart_suit: 特征 :sparkles: 自动在您的个人网站上显示您的GitHub公共仓库,博客帖子(dev.to或...