- 浏览: 100934 次
- 性别:
- 来自: 北海
最新评论
-
July01:
最近了解到一款StratoIO打印控件,功能如下:1、Html ...
IE下利用js实现打印功能 -
sunxiyuan111:
试了第三种方法 ,管用,解决了大问题谢谢
jasperreports导出pdf报表时粗体的显示问题 -
java爱好者92:
主子报表帆软报表官网上的攻略说得很详细,可以参考一下
利用iReport制作子报表 -
fengjianquan9527:
狗屁不通,毛用不管
jasperreports导出pdf报表时粗体的显示问题 -
xiegqooo:
codeloafer 写道现在activemq5.6 以上ne ...
ActiveMQ集群应用
compass搜索引擎的应用
- 博客分类:
- 开发笔记
前阵子在做一个手机服务器端系统的开发,主要使用spring+hibernate框架,由于系统涉及到全文检索功能,所以很自然地就想到了compass这个开源的搜索引擎,并且在j2ee领域,个人觉得目前最好用的就是这个了。为了提高系统的性能,我们大量的使用了compass创建的索引来做数据查询,因为我们主要功能是数据查询,很少做数据的更改,所以比较适合用这种方式,也收到了很好的效果。
首先是spring与compass的集成配置文件:applicationContext-compass.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd" default-lazy-init="true"> <!-- 配置compass注解 --> <bean id="annotationConfiguration" class="org.compass.annotations.config.CompassAnnotationsConfiguration"> </bean> <!-- 配置compass bean --> <bean id="compass" class="org.compass.spring.LocalCompassBean"> <!-- 定义索引存放路径 --> <property name="connection"> <value>file://${index.path}</value> </property> <!-- 配置需要创建索引的实体 --> <property name="classMappings"> <list> <value>com.***.mobile.entity.KnowledgeInfo</value> <value>com.***.mobile.entity.ChannelInfo</value> <value>com.***.mobile.entity.MobileBaseEntity</value> <value>com.***.mobile.entity.BaseEntity</value> <value>com.***.mobile.entity.BusLine</value> </list> </property> <property name="compassConfiguration" ref="annotationConfiguration"></property> <property name="compassSettings"> <props> <!-- compass事务工厂 --> <prop key="compass.transaction.factory">org.compass.spring.transaction.SpringSyncTransactionFactory</prop> <!-- paoding分词器 --> <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="#cc0033"><b>]]></prop> <prop key="compass.engine.highlighter.default.formatter.simple.post"><![CDATA[</b></font>]]></prop> </props> </property> <property name="transactionManager" ref="transactionManager" /> </bean> <!-- 用Hibernate3事件系统,支持Real Time Data Mirroring.经Hiberante改变的数据会自动被反射到索引里面 --> <bean id="hibernateGpsDevice" class="org.compass.gps.device.hibernate.dep.Hibernate3GpsDevice"> <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.hibernate.dep.SpringHibernate3GpsDevice"> <property name="name" value="hibernateDevice"/> <property name="sessionFactory" ref="sessionFactory"/> </bean> </list> </property> </bean> <bean id="compassTemplate" class="org.compass.core.CompassTemplate"> <property name="compass" ref="compass" /> </bean> </beans>
接着是实体的compass注解,将需要创建索引的实体及实体属性标注:
@Entity @Table(name="B_ENTITY_BASE") @Searchable public class MobileBaseEntity implements Serializable { private static final long serialVersionUID = -5594658438463757978L; @SearchableId protected String id; @SearchableProperty(name = "keys") protected String name; @SearchableProperty(index = Index.NO, store = Store.YES) protected String address; protected String phone; protected String description; @SearchableProperty(index = Index.NO, store = Store.YES) protected Double longitude; @SearchableProperty(index = Index.NO, store = Store.YES) protected Double latitude; @SearchableProperty(index = Index.NO, store = Store.YES) protected String type; protected String channel; protected String knowledgeId; protected String stauts;//0审核退回,1审核中,2正常 }
@SearchableId:不要求定义搜索的元数据;
@SearchableProperty(name = "keys"):属性索引的别名,这个别名在做查询的时候会用到,我们可以把多个实体类的多个属性定义为同一个别名来做全文检索;
@SearchableProperty(index = Index.NO, store = Store.YES):保存这个属性的值,但不作为索引。index = Index.XXX,这个有几种策略,1:NOT_ANALYZED ,不分词但创建索引;2:ANALYZED,分词并创建索引。
@SearchableComponent:关联复合索引,用以复合类型;
@SearchableReference:用以引用类型。
接下来就是使用compass的API来做数据查询,首先是模糊匹配查询,
List<BusLine> busLineList = new ArrayList<BusLine>(); Compass compass = this.compassTemplate.getCompass(); CompassSession compassSession = compass.openSession(); CompassQueryBuilder queryBuilder = compassSession.queryBuilder(); //指定查询实体 CompassQuery queryAlias = queryBuilder.alias(BusLine.class.getSimpleName()); CompassBooleanQueryBuilder boolQueryBuilder = queryBuilder.bool(); boolQueryBuilder.addMust(queryAlias); boolQueryBuilder.addMust(queryBuilder.wildcard("baseEntityKeys", "*"+value+"*")); CompassHits compassHits = boolQueryBuilder.toQuery().hits(); if(compassHits != null && compassHits.length() > 0) { for(int i = 0; i < compassHits.length(); i++) { BusLine line = (BusLine)compassHits.data(i); busLineList.add(line); } } compassSession.close(); return busLineList;
至于是使用模糊匹配查询还是全文检索,这需要根据应用场景来选择,能使用模糊匹配的话尽量使用,全文检索的代价比模糊匹配要高。全文检索的例子:
String keywords = keyword.trim(); List<KnowledgeInfo> result = new ArrayList<KnowledgeInfo>(); Properties prop = PropertyUtil.readPropertyFile(); String type = prop.getProperty("knowledge.zc.type"); ChannelInfo channel = channelInfoService.getChannelById(type); Compass compass = this.compassTemplate.getCompass(); CompassSession session = compass.openSession(); CompassQueryBuilder builder = session.queryBuilder(); CompassBooleanQueryBuilder boolBuidler = builder.bool(); boolBuidler.addMust(builder.wildcard("sort", channel.getSort()+"*")); if(keywords != null && !"".equals(keywords)) { String[] array = keywords.split(" "); if (array != null && array.length > 0) { for (String value : array) { if (value != null && StringUtils.isNotEmpty(value.trim())) { boolBuidler.addMust(builder.queryString("keys:" + value).toQuery()); } } } CompassHits hits = boolBuidler.toQuery().hits(); if (hits != null && hits.length() > 0) { for (int i = 0; i < hits.length(); i++) { KnowledgeInfo info = (KnowledgeInfo) hits.data(i); String ht = hits.highlighter(i).fragment("keys"); if (null != ht) { info.setKeywords(ht); } result.add(info); } } } session.close(); return result;
compass一个简单的应用就完成了。
发表评论
-
cas客户端应用实现
2011-12-20 15:51 6634cas服务器端的开发请参考: http://xiaomage ... -
cas+tomcat开发单点登录教程(定制认证方式篇)
2011-12-19 20:43 10280CAS 是 Yale 大学发起的 ... -
java开发webservice的几种方式
2011-12-17 15:33 10724webservice的应用已经越来 ... -
spring security 3.0 实现认证与授权
2011-07-10 20:11 1964先看一下spring security 官方对以下几个类或接口 ... -
EJB系统使用JMS异步发送邮件
2011-01-26 15:58 2061EJB中有三种Bean,EntityBean,SessionB ... -
jasperreports导出pdf报表时粗体的显示问题
2010-12-23 17:14 6420最近一直在做报表,用的是iReport3.7.3和jasper ... -
利用iReport制作子报表
2010-12-10 16:09 5725iReport版本:3.7.3,JavaBean作为数据源。1 ... -
解决GET提交中文乱码问题
2010-11-19 15:20 2630今天同事在做一个手机 ... -
IE下利用js实现打印功能
2010-10-29 11:08 3559这主要是用到了IE的一个内置插件,在html代码的<he ... -
struts2+jasperReport生成各种形式的报表
2010-10-28 17:10 2843/** * 導出html形式報表 * @param r ... -
利用js给select element产生年份
2010-10-25 16:32 2631function generateYearFun() { v ... -
解决struts2+jasperReport在生成html形式的报表时的图片问题
2010-10-18 14:09 3462Struts2和jasperReport整合时,在生成html ... -
struts2 java.lang.IllegalStateException异常的解决方法
2010-10-15 18:46 4875环境:eclipse+struts2+EJB3.0+jaspe ... -
Tomcat JVM调优有感
2010-09-25 22:42 2104最近在做一个社交类网 ... -
struts2+ajax做的一个级联下拉列表
2010-09-20 14:47 2635struts2+ajax做的一个级联下拉列表 struts端代 ... -
struts2+jsonplugin的问题
2010-09-15 00:16 1273[size=xx-small]今天做项目碰到了个问题,在做一个 ... -
关于embed标签的src属性
2010-09-05 16:47 1801前阵子做个项目,需要把用户上传的pdf文件转换为swf文件然后 ... -
ssh与jbpm4.3的整合
2010-05-28 20:23 1444首先说一下环境,spring3.0+struts2+hiber ...
相关推荐
由于搜索引擎功能在门户社区中对提高用户体验有着重在门户社区中涉及大量需要搜索引擎的功能需求,目前在实现搜索引擎的方案上有集中方案可供选择: 1) 基于Lucene自己进行封装实现站内搜索。工作量及扩展性都较大,...
Compass 框架以声明方式为您的应用程序堆栈启用了搜索引擎语义的强大功能。 Compass 建立在令人惊叹的 Lucene 搜索引擎之上,无缝集成到流行的开发框架,如 Hibernate 和 Spring。
Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码...
Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码...
AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器 j2wap j2wap 是一个基于Java的WAP浏览器,目前处于BETA测试阶段。它支持WAP 1.2规范,除了WTLS 和WBMP。 Java注册表操作类 jared jared是...
AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器 j2wap j2wap 是一个基于Java的WAP浏览器,目前处于BETA测试阶段。它支持WAP 1.2规范,除了WTLS 和WBMP。 Java注册表操作类 jared jared是...
AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器 j2wap j2wap 是一个基于Java的WAP浏览器,目前处于BETA测试阶段。它支持WAP 1.2规范,除了WTLS 和WBMP。 Java注册表操作类 jared jared是...
AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器 j2wap j2wap 是一个基于Java的WAP浏览器,目前处于BETA测试阶段。它支持WAP 1.2规范,除了WTLS 和WBMP。 Java注册表操作类 jared jared是...
AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器 j2wap j2wap 是一个基于Java的WAP浏览器,目前处于BETA测试阶段。它支持WAP 1.2规范,除了WTLS 和WBMP。 Java注册表操作类 jared jared是...
AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器 j2wap j2wap 是一个基于Java的WAP浏览器,目前处于BETA测试阶段。它支持WAP 1.2规范,除了WTLS 和WBMP。 Java注册表操作类 jared jared是...
AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器 j2wap j2wap 是一个基于Java的WAP浏览器,目前处于BETA测试阶段。它支持WAP 1.2规范,除了WTLS 和WBMP。 Java注册表操作类 jared jared是...
AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器 j2wap j2wap 是一个基于Java的WAP浏览器,目前处于BETA测试阶段。它支持WAP 1.2规范,除了WTLS 和WBMP。 Java注册表操作类 jared jared是...
AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器 j2wap j2wap 是一个基于Java的WAP浏览器,目前处于BETA测试阶段。它支持WAP 1.2规范,除了WTLS 和WBMP。 Java注册表操作类 jared jared是...
AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器 j2wap j2wap 是一个基于Java的WAP浏览器,目前处于BETA测试阶段。它支持WAP 1.2规范,除了WTLS 和WBMP。 Java注册表操作类 jared jared是...
AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器 j2wap j2wap 是一个基于Java的WAP浏览器,目前处于BETA测试阶段。它支持WAP 1.2规范,除了WTLS 和WBMP。 Java注册表操作类 jared jared是...
AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器 j2wap j2wap 是一个基于Java的WAP浏览器,目前处于BETA测试阶段。它支持WAP 1.2规范,除了WTLS 和WBMP。 Java注册表操作类 jared jared是...
AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器 j2wap j2wap 是一个基于Java的WAP浏览器,目前处于BETA测试阶段。它支持WAP 1.2规范,除了WTLS 和WBMP。 Java注册表操作类 jared jared是...
自述文件 该自述文件通常会记录启动和运行应用程序所需的所有步骤。 您可能要讲的内容: Ruby版本 系统依赖 配置 数据库创建 数据库初始化 ...服务(作业队列,缓存服务器,搜索引擎等) 部署说明 ...
您可能想要涵盖的内容: Ruby版系统依赖配置数据库创建数据库初始化如何运行测试套件服务(作业队列、缓存服务器、搜索引擎等) 部署说明… 如果您不打算运行rake doc:app请随意使用不同的标记语言。