- 浏览: 797460 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (120)
- Spring (10)
- ExtJs (2)
- Struts (15)
- Hibernate (4)
- 数据库 (2)
- Java (7)
- JSP (4)
- JavaScript (7)
- Oracle (5)
- 面试总结(收集的) (0)
- XML (3)
- 常用小技巧 (8)
- Ruby On Rails (4)
- JBPM (1)
- hsqldb (1)
- Java与模式 (5)
- Linux (5)
- WebLogic (2)
- FreeMarker (1)
- Android (1)
- PHP (1)
- Lucene (9)
- WebService----CXF (9)
- DB2 (4)
- MyBatis (1)
- JVM (3)
- GIT (1)
- JMS及ActiveMQ (4)
- Shiro (1)
最新评论
-
yadongliang:
楼主,我的地址栏http://localhost:8080/p ...
CXF之三(REST风格的支持) -
wangyudong:
由CXF实现的微服务需要有比较好的工具去测试RESTful A ...
CXF之三(REST风格的支持) -
renguoliang0508:
renguoliang0508 写道你好,我又来了,按你这里的 ...
CXF之六(对请求参数和返回给客户数据处理) -
renguoliang0508:
你好,我又来了,按你这里的实现。POST形式中获取不到参数。请 ...
CXF之六(对请求参数和返回给客户数据处理) -
renguoliang0508:
首先对您标示感谢,从拦截器的实现那篇参照做的,过程有点异常最终 ...
CXF之六(对请求参数和返回给客户数据处理)
1、Compass简单介绍
Compass是一个强大的,事务的,高性能的对象/搜索引擎映射(OSEM:object/search engine mapping)与一个Java持久层框架。
Compass包括以下功能:
* 搜索引擎抽象层(使用Lucene搜索引荐),
* OSEM (Object/Search Engine Mapping) 支持,
* 事务管理,
* 类似于Google的简单关键字查询语言,
* 可扩展与模块化的框架,
* 简单的API.
2、Compass的优点与缺点
优点:
* Compass将lucene、Spring、Hibernate三者的起来,以很低很低的成本快速实现企业应用中的搜索功能;
* Compass比较成熟,网上的文档很多,入门很简单;
* 更多优点
缺点:
* Compass目前版本是2.2.0,已经很久没有更新与维护。Compass2.2的版本所对应的Lucene2.4.1,但现在Lucene已经升级到3以上的版本,Lucene3以上的版本的API差别很大,3.0以后版本貌似效率更高
* 说这么多最终目的是说Compass目前只支持到Lucene2.4.1版本,如果你想使用Lucene就不能使用Compass了
* 现在已经有Hibernate Search作为搜索引擎框架,可以与Lucene进行联合使用。但我没有真正的去使用过。
3、Compass
Compass 通过OSEM(Object/Search Engine Mapping)允许把应用对象的领域模型映射到搜索引擎,目前有两种方式来进行OSEM,分别是XML方式和JDK5以上的注解(Annotation)
方式。
与采用xml配置文件相比较,采用Annonation方式还是相对简单。使用注解方式核心标注只有@Searchable、@SearchableId、@SearchableProperty、 @SearchableComponent个,很容易记忆,
不想XML那么麻烦,尤其是和spring、hiberante一起使用时,建议采用注解方式。
(1)、注解详细信息
@Searchable、@SearchableId、@SearchableProperty、 @SearchableComponent分别代表搜索类、主键、可搜索的属性与关联的、另一个可搜索的对象
(注:Compass要求POJO要有默认构造函数,要实现equals()和hashcode()):
(a)、@Searchable
如:
@Searchable
public class Article {
(b)、@SearchableId
如:
@SearchableId
private String id;
也可以这样写
@SearchableId
public Integer getId() {
return this.id;
}
(c)、@SearchableProperty
@SearchableProperty(name="name", store=Store.NA)
private String name;
也可以放在该属性的getter方法的前
@SearchableProperty注解有几个属性需要注意:
store:
Store.NA,默认值,等同Store.YES
Store.NO 与Lucene中的Field.Store.NO;指定不存储域值
Store.YES 与Lucene中的Field.Store.YES;指定存储域值
Store.COMPRESS
index:
Index.NA:
Index.NO:使对应的域值不进行搜索
INDEX.ANALYZED:对域进行索引,并将域值分解成对应的词汇单元,并使每个词汇单元能被搜索
INDEX.NOT_ANALYZED:对域进行索引,但不对string值进行分析
boost:域的加权
其它的可以仔细了解
(2)、Compass核心API
Compass的核心API借鉴了Hibernate的术语,因此在操作上基本上与Hibernate类似,以下为Compass的几个核心接口:
CompassConfiguration(类似Hibernate Configuration):用来在一些设置参数、配置文件和映射定义上配置Compass。通常用来创建Compass接口。
Compass(类似Hibernate SessionFactory):为单线程使用,创建线程安全的实例来打开Compass Seesion。同样还提供了一些搜索引擎索引级别的操作。
CompassSesssion(类似Hibernate Session):用来执行像保存、删除、查找、装载这样的搜索操作。很轻量但是并不是线程安全的。
CompassTransaction(类似Hibernate Transaction):管理Compass事务的接口。使用它并不需要事务管理环境(像Spring、JTA)。
Compass和Hibernate很相像,无非就是Hibernate把JDBC封装了一把.所以从结构上来说,只要我们了解了Hibernate,就已经对Compass有了了解.那么Hibernate需要提供API和配置文件来对JDBC进行操作,那么Compass呢?Compass不仅从结构上模仿了Hibernate,就连API风格也不尽相同.我们把它和Hibernate的API做个对比就知道了:
再把两个session的核心方法比较一下:
Hibernate session API |
CompassSession API |
|
save(Object) |
create(Object) |
建立索引 |
saveOrUpdate(Object) |
save(Object) |
保存或更新 |
delete(Object) |
delete(Class, ids...) |
删除索引 |
get() |
get() |
获取 |
createQuery(hql).list() |
find(String) |
使用查询字符串查询 |
所以说,Compass与Hibernate极为相似,Compass总结起来就两句话:
4、Compass、Lucene、Spring、Hibernate集成
可以不为compass编写一行代码或者很少的代码,就可以做完搜索引擎的检索
使用Lucene2.4.1;Compass2.2.0
<!-- 使用annotation配置,指定要转换的POJO。PO类在compass的classMappings值指定 --> <bean id="annotationConfiguration" class="org.compass.annotations.config.CompassAnnotationsConfiguration"> </bean> <bean id="compass" class="org.compass.spring.LocalCompassBean"> <!-- OSEM映射的对象PO类 --> <property name="classMappings"> <list> <value>com.core.persistence.po.Article</value> <value>com.core.persistence.po.Author</value> </list> </property> <!-- 使用注解配置 --> <property name="compassConfiguration" ref="annotationConfiguration"/> <property name="compassSettings"> <props> <!-- 索引文件在服务器上的存储路径 如:file://d:/index --> <prop key="compass.engine.connection">/lucene/indexes</prop> <!-- 在内存中建立索引 <prop key="compass.engine.connection">ram://index</prop> --> <prop key="compass.transaction.factory"> org.compass.spring.transaction.SpringSyncTransactionFactory </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="compassTemplate" class="org.compass.core.CompassTemplate"> <property name="compass" ref="compass"/> </bean> <!-- 与hibernate的绑定,经Hiberante的数据改变会自动被反射到索引里面(增加、修改、删除操作). --> <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> <ref local="hibernateGpsDevice"/> </list> </property> </bean> <!-- 定时重建索引(利用quartz)或随Spring ApplicationContext启动而重建索引 --> <bean id="compassIndexBuilder" class="com.lucene.service.CompassIndexBuilder" lazy-init="false"> <property name="compassGps" ref="compassGps"/> <property name="buildIndex" value="true"/> <property name="lazyTime" value="10"/> </bean> public class CompassIndexBuilder implements InitializingBean { private static final Logger log = Logger.getLogger(CompassIndexBuilder.class); // 是否需要建立索引,可被设置为false使本Builder失效. private boolean buildIndex = true; // 索引操作线程延时启动的时间,单位为秒 private int lazyTime = 10; // Compass封装 private CompassGps compassGps; // 索引线程 private Thread indexThread = new Thread() { @Override public void run() { try { Thread.sleep(lazyTime * 1000); log.info("begin compass index..."); long beginTime = System.currentTimeMillis(); // 重建索引. // 如果compass实体中定义的索引文件已存在,索引过程中会建立临时索引, // 索引完成后再进行覆盖. compassGps.index(); long costTime = System.currentTimeMillis() - beginTime; log.info("compss index finished."); log.info("costed " + costTime + " milliseconds"); } catch (InterruptedException e) { } } }; /** * 实现<code>InitializingBean</code>接口,在完成注入后调用启动索引线程. * @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet() */ public void afterPropertiesSet() throws Exception { 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; } }
5、进行简单搜索
Compass compass = compassTemplate.getCompass(); CompassSession session=compass.openSession(); List list = new ArrayList(); CompassHits hits= session.queryBuilder().queryString(queryString).toQuery().hits(); for(int i=0;i<hits.length();i++){ Person hit=( Person)hits.data(i); list.add(hit); } session.close(); return list;
以上内容有参考他人之处,不在这列出,谢谢!
发表评论
-
Lucene之八(Lucene的高亮显示)
2012-12-22 10:57 12255在Lucene的org.apache.lu ... -
Lucene之七(开源的中文分析器)
2012-12-22 09:35 5778当前的中文分析器大致的有以下几个 1、IK Analy ... -
Lucene之六(Lucene内置Analysis分析器)
2012-12-21 15:56 83681、WhitespaceAnalyzer ... -
Lucene之五(Analysis分析器)
2012-12-21 14:58 2538在搜索的过程中,有 ... -
Lucene之四(文件操作类3-FileSwitchDirectory)
2012-12-21 11:58 2232FileSwitchDirectory Fi ... -
Lucene之三(文件操作类2-FSDirectory)
2012-12-21 11:54 7738FSDirectory FSDirectory是Luc ... -
Lucene之二(文件操作类1-RAMDirectory)
2012-12-21 11:33 5539由上一文章,我们知道Lucene中的索引库的概念,我们可 ... -
Lucene之一(Lucene的概念一)
2012-12-20 15:31 12422Lucene的基本概念 Lucene是什么? ...
相关推荐
网站快速加入全文检索文档,介绍compass基础知识入门、准备、开发入门等
在数学上严谨,本书从介绍,坐标和时间系统和卫星轨道的基础知识,以及GPS可观测量开始,并涉及物理影响,观测方程及其参数化,调整和过滤,模糊度解析,软件等主题开发和数据处理以及扰动轨道的确定。
##DEMO 项目来说明 AngularJs 的基础知识 - 范围、数据绑定、控制器等。 ================== 使用的技术 1. NodeJS 2. Bower package ( npm install bower -g ) 3. Ruby refer : ...
Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...
----------------------------------- Android 编程基础 1 封面----------------------------------- Android 编程基础 2 开放手机联盟 --Open --Open --Open --Open Handset Handset Handset Handset Alliance ...
HackerRank-Python 我对HackerRank Python练习问题的解决方案。
最底层的是一个 Linux Kernel,加载了几个移动设备必要的系统驱动(这么说来 Android 基础系统是要以 GPL 发布了?不知道 34 家厂商的硬件开发商们是怎么样想的);上面是类库和 Runtime,绿色的类库部分可以看 到...
Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...
compass 响应式开发 常见设备宽高 Flex 弹性盒布局 媒体查询(Media Query) 用 REM 开发响应式设计 多列布局(Multiple Columns) 前端性能优化 浏览器兼容 CSS HAck 优质工具网站推荐 参考资料 关于 CSS 详细
第一章 信息检索的基本知识 第一节 信息、知识、文献、情报 信息: 应用文字、数据和信号形式通过一定的传递和处理,来表现各种相互联系的客观事物在运动变化中所具有特征性的内容的总称。 知识: 人们通过实践对...
关于K线图的一些基础知识,如阴线、阳线、高开低收,去百度学习下,这样开发起来会方便很多。 3.十字标 首先对View进行手势监听GestureDetector,当触发长按onLongPress方法时,记录当前手指的X坐标,通过当前X坐标...
高级编程语言:命名TBD项目 Un progetto di: Bartolomeo Caruso(1000008726) 加布里埃尔·科斯坦佐... 在progetto软件基础上的基础知识,在Maniera Solida中的Capgest Digestire,有效的多样化任务。 特别是:
如果您对Jekyll的工作方式不熟悉,请访问以获得所有详细信息,或者仅阅读有关,和的基础知识。 manbetx客户端打不开:只需叉子这个仓库并开始编辑_config.yml文件! GitHub :分叉此存储库并创建一个名为gh-pages...
这个工程是总结JavaEE中一些常用的基础知识,很久之前换工作,想着复习下EE里面的技术点,于是找了些东西看,但是感觉网上东西太多太乱,于是下定决心,以后有时间一定要总结一下这一块的技术点,于是就出现了这个...
基础知识使用整数和浮点数的数学运算 用法 您需要安装Java JDK / JRE才能运行此程序。 要从CMD中自由调用该程序,请创建一个批处理文件(commandname.cmd)并将其放在PATH(PATH环境变量)的文件夹中。 将其放在...
Biostatistics基础知识,第8版,Duxbury。 (与EPI 808中使用的教科书相同)。 先决条件:EPI 808,EPI 851或同等学历。 教学大纲:请参阅D2L 课程目标:(i)定量变量的统计分析,包括相关性,简单和多元线性...
测试NODEJS AUDARA Pruebabásicapara desarrollador后端科门赞多 :rocket: 在当地生产和销售产品的过程中,... npm installDentro del proyecto覆盖database配置了脚本audara_test.sql并提供了基础知识。 第conf
Clarusway IT基础知识队列008 Clarusway研讨会回购主要面向学生,包含动手实践和没有解决方案的项目。 此私人研讨会资料库包含项目,实践培训,编码挑战和Clarusway信息技术基础课程队列007的学生的课堂笔记。 ...
基本FE项目存储库注定包含一些有关html,css,javascript,打字稿的基础项目,目的是提高前端知识。