- 浏览: 306460 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (165)
- hadoop (47)
- linux (11)
- nutch (7)
- hbase (7)
- solr (4)
- zookeeper (4)
- J2EE (1)
- jquery (3)
- java (17)
- mysql (14)
- perl (2)
- compass (4)
- suse (2)
- memcache (1)
- as (1)
- roller (1)
- web (7)
- MongoDB (8)
- struts2 (3)
- lucene (2)
- 算法 (4)
- 中文分词 (3)
- hive (17)
- noIT (1)
- 中间件 (2)
- maven (2)
- sd (0)
- php (2)
- asdf (0)
- kerberos 安装 (1)
- git (1)
- osgi (1)
- impala (1)
- book (1)
- python 安装 科学计算包 (1)
最新评论
-
dandongsoft:
你写的不好用啊
solr 同义词搜索 -
黎明lm:
meifangzi 写道楼主真厉害 都分析源码了 用了很久. ...
hadoop 源码分析(二) jobClient 通过RPC 代理提交作业到JobTracker -
meifangzi:
楼主真厉害 都分析源码了
hadoop 源码分析(二) jobClient 通过RPC 代理提交作业到JobTracker -
zhdkn:
顶一个,最近也在学习设计模式,发现一个问题,如果老是看别人的博 ...
Java观察者模式(Observer)详解及应用 -
lvwenwen:
木南飘香 写道
高并发网站的架构
- 我们在使用lucene管理document时,难免有些复杂,并且在做增量索引的时候会比较繁琐,现介绍compass如下:
- compass对lucene的使用就如同Hibernate和对jdbc的使用。
- Compass的使用步骤:
- Hibernate的实现步骤是:
- 1 》 设计实体
- 2 》 配置映射元数据 (xml / 注解—Hibernate3才推出来的)
- 3 》 利用Hibernate的api完成对实体的CURD
- 我们目前使用compass的操作步骤就与Hibernate的基本一样的:
- Hibernate的第二步是映射到数据库,而compass是映射到收索引擎里面去。
- 1 》 设计收索实体 – 就 是一个普通的javabean
- 你要写这么一个实体,定义一些属性,好比产品的id、名称
- 2 》 配置映射元数据 – 针对收索引擎映射-我们采用主注解的方式
- 我们使用@Searchable 标注映射为收索实体,映射到Lucene中的document
- 假设是采用注解的形式,我们就需要在实体和属性上面加上一些注解
- @Entity (映射到数据库中的表)
- @Searchable –> 这个注解把该类声明为搜索实体,映射到lucene中的document
- Public class Product{
- @Id (Hibernate用来表示实体的标识属性)
- @SearchableId (compass标注为标识属性)
- Private Integer id;
- @Column ()
- @SearchableProperty à 映射搜索属性
- Private String name;
- }
- 3 >利用compass api完成对实体的添/删/查操作
- hibernate.cfg.xml / compass.cfg.xml 放在类路径下
- hibernate: SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
- Compass: Compass compass = new CompassConfiguration().configure().buildCompass();
- SessionFactory == Compass
- hibernate: Session session = sessionFactory.openSession();
- compass: CompassSession session = compass.openSession();
- Session = CompassSession
- Hibernate: session.beginTransaction();
- compass: session.beginTransaction();
- Hibernate: session.save(product)/persist();
- compass: session.save(product)/create();
- Hibernate: session.getTransaction().commit();
- compass: session.getTransaction().commit();
- session.close();
- sessionFactory.close();
- 学习一下compass映射注解:常用的就5 个
- @Searchable //告诉compass,将该类映射到lucene的Document
- 注意注解如果标注在属性上只能标注在get方法上面
- @SearchableId //compass要求每个搜索实体类都要具有一个标识属性,这点和Hibernate相似
- @SearchableProperty (index=Index.NOT_ANALYZED ,store=Store.YES) // store的默认值为Store.YES
- 类别id不需要分词,蛋需要索引并存储
- Index。UN_TOKENIZED 不对该field进行分词,但是要索引,该属性已过时,建议产用NOT__ANALYZED替换
- Index.TOKENIZED:先分词后索引。该属性已过时,建议采用ANALYZED替换
- Inde.NOT_ANALYZED 不分词,但建立索引
- Index.ANALYZED 分词并且建立索引
- @SearchableId Property(boost= 2 ) //boost的默认值为1,用户设置属性在索引中的重要性
- 如下:
- @Searchable //告诉compass,将该类映射到Lucene的Document
- public class Product {
- private Integer id;
- private String name;
- private String content;
- private Float price;
- private String note;
- private Integer position;
- private Integer typeid;
- public Product(){}
- public Product(Integer id) {
- this .id = id;
- }
- public Product(Integer id, String name, String content, Float price,String note,Integer typeid,Integer position) {
- this .id = id;
- this .name = name;
- this .content = content;
- this .price = price;
- this .note = note;
- this .typeid = typeid;
- this .position = position;
- }
- @SearchableId //compass要求每个搜索实体类都要具有一个标识属性,这点和Hibernate相似
- public Integer getId() {
- return id;
- }
- public void setId(Integer id) {
- this .id = id;
- }
- //类别id不需要分词,但需要索引并储存
- //Index.UN_TOKENIZED:不对该Field进行分词,但是要索引.该属性已过时,建议采用NOT_ANALYZED替换
- //Index.TOKENIZED:先分词后索引。该属性已过时,建议采用ANALYZED替换
- //Index.NOT_ANALYZED:不分词,但建立索引
- //Index.ANALYZED :分词并且建立索引
- @SearchableComponent //关联的符合索引,专门用来标注复合类型
- 那么被标注的这个属性对应的类,我们也要标注一下为收索实体,但是这个搜索实体他不是单独存在的,他只是最为产品搜索实体的一部分
- @Searchable (root= false )
- @SearchableProperty (index=Index.NO ,store=Store.YES)
- 我们对他的主键不需要索引只需要存储
- 当你存在双向关系的时候,并且需要引用会对应的实体,反指引用
- @SearchableReference
- @SearchableProperty (index=Index.NOT_ANALYZED, store=Store.YES) //store的默认值为Store.YES
- public Integer getTypeid() {
- return typeid;
- }
- public void setTypeid(Integer typeid) {
- this .typeid = typeid;
- }
- @SearchableProperty (boost= 2 ) //boost的默认值为1,用于设置属性在索引中的重要性
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this .name = name;
- }
- @SearchableProperty
- public String getContent() {
- return content;
- }
- public void setContent(String content) {
- this .content = content;
- }
- //价格不需要进行搜索,但需要存储,如果没有存储,就需要从数据库中获取价格了
- @SearchableProperty (index=Index.NO) //store的默认值为Store.YES
- public Float getPrice() {
- return price;
- }
- public void setPrice(Float price) {
- this .price = price;
- }
- @SearchableProperty (store=Store.YES)
- public String getNote() {
- return note;
- }
- public void setNote(String note) {
- this .note = note;
- }
- @SearchableProperty (index=Index.NOT_ANALYZED, store=Store.YES) //store的默认值为Store.YES
- public Integer getPosition() {
- return position;
- }
- public void setPosition(Integer position) {
- this .position = position;
- }
- }
- 我们不集成spring的编程配置和使用方式如下:
- import java.util.ArrayList;
- import java.util.List;
- import org.compass.annotations.config.CompassAnnotationsConfiguration;
- import org.compass.core.Compass;
- import org.compass.core.CompassException;
- import org.compass.core.CompassHits;
- import org.compass.core.CompassQueryBuilder;
- import org.compass.core.CompassSession;
- import org.compass.core.CompassTransaction;
- import org.compass.core.CompassQuery.SortDirection;
- import org.compass.core.CompassQuery.SortPropertyType;
- import org.compass.core.config.CompassEnvironment;
- import cn.itcast.bean.Product;
- import cn.itcast.bean.QueryResult;
- import cn.itcast.compass.service.ProductSearch;
- public class ProductSearchBean implements ProductSearch {
- private Compass compass = null ; //-->SessionFactory
- public ProductSearchBean(){
- try {
- //编程式配置
- compass = new CompassAnnotationsConfiguration()
- .setSetting(CompassEnvironment.CONNECTION, "[url=file://indexfile]file://indexfile[/url]" )
- //.setSetting(CompassEnvironment.CONNECTION, "ram://index")//在内存中建立索引
- .setSetting("compass.engine.highlighter.default.formatter.simple.pre" , "<font color='red'>" )
- .setSetting("compass.engine.highlighter.default.formatter.simple.post" , "</font>" )
- .addScan("cn.itcast.bean" ).buildCompass();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- //compass支持增量索引,社会上很多公司,他们的产品都没有实现增量索引,1>lucene版本比较低,不支持增量索引,2>要增量索引,技术要求稍微有点高
- //(晚上 2-3,定时器,把索引文件删除,重新生成索引)实时性不强,在索引文件更新的时候,用户是访问不了的
- public void buildIndex(){
- CompassSession session = null ;
- CompassTransaction tx = null ;
- try {
- session = compass.openSession();
- tx = session.beginTransaction();
- Product p1 = new Product( 12 , "c瑜珈球" , "非常好的瑜珈球" ,12f, "www" , 2 , 12 );
- session.create(p1);
- Product p2 = new Product( 35 , "b瑜珈球" , "天花板瑜珈球,good" ,42f, "mmm" , 2 , 9 );
- session.create(p2);
- Product p3 = new Product( 8 , "a蓝球瑜珈球" , "蓝球小子" ,125f, "ppp" , 5 , 8 );
- session.create(p3);
- tx.commit();
- } catch (CompassException e) {
- e.printStackTrace();
- tx.rollback();
- }finally {
- if (session!= null && !session.isClosed()) session.close();
- }
- }
- public void deleteIndex(Product product) {
- CompassSession session = null ;
- CompassTransaction tx = null ;
- try {
- session = compass.openSession();
- tx = session.beginTransaction();
- session.delete(product);
- tx.commit();
- } catch (CompassException e) {
- e.printStackTrace();
- tx.rollback();
- }finally {
- if (session!= null && !session.isClosed()) session.close();
- }
- }
- public void updateIndex(Product product) {
- CompassSession session = null ;
- CompassTransaction tx = null ;
- try {
- session = compass.openSession();
- tx = session.beginTransaction();
- session.delete(product);
- session.save(product);
- tx.commit();
- } catch (CompassException e) {
- e.printStackTrace();
- tx.rollback();
- }finally {
- if (session!= null && !session.isClosed()) session.close();
- }
- }
- public void destroy(){
- compass.close();
- }
- public QueryResult<Product> search(String keyword, int firstIndex, int maxResult) {
- QueryResult<Product> qr = new QueryResult<Product>();
- CompassSession session = null ;
- CompassTransaction tx = null ;
- try {
- session = compass.openSession();
- tx = session.beginTransaction();
- //对所有索引Field进行搜索,你也可以指定对某个Field搜索,如:"name:jack",如果想指定多个字段可以用空格和"+"隔开如"name:jack +content:xxx"
- CompassHits hits = session.find(keyword);
- List<Product> products = new ArrayList<Product>();
- int length = firstIndex+ maxResult;
- if (length>hits.length()) length = hits.length();
- for ( int i=firstIndex; i<length; i++){
- Product product = (Product)hits.data(i);
- product.setContent(hits.highlighter(i).fragment("content" ));
- products.add(product);
- }
- qr.setResultlist(products);
- qr.setTotalrecord(hits.length());
- hits.close();
- } catch (CompassException e) {
- e.printStackTrace();
- tx.rollback();
- }finally {
- if (session!= null && !session.isClosed()) session.close();
- }
- return qr;
- }
- public QueryResult<Product> search(String keyword, Integer typeid, int firstIndex, int maxResult) {
- QueryResult<Product> qr = new QueryResult<Product>();
- CompassSession session = null ;
- CompassTransaction tx = null ;
- try {
- session = compass.openSession();
- tx = session.beginTransaction();
- //查询指定类别的匹配记录,并按position降序排序
- CompassQueryBuilder queryBuilder = session.queryBuilder();
- CompassHits hits = queryBuilder.bool()
- .addMust(queryBuilder.spanEq("typeid" , typeid))
- .addMust(queryBuilder.queryString(keyword).toQuery())
- .toQuery().addSort("position" , SortPropertyType.FLOAT, SortDirection.REVERSE)
- .hits();//sql: typeid=1 and (xxxx like ?) order by positoin desc
- List<Product> products = new ArrayList<Product>();
- int length = firstIndex+ maxResult;
- if (length>hits.length()) length = hits.length();
- for ( int i=firstIndex; i<length; i++){
- Product product = (Product)hits.data(i);
- product.setContent(hits.highlighter(i).fragment("content" ));
- products.add(product);
- }
- qr.setResultlist(products);
- qr.setTotalrecord(hits.length());
- hits.close();
- } catch (CompassException e) {
- e.printStackTrace();
- tx.rollback();
- }finally {
- if (session!= null && !session.isClosed()) session.close();
- }
- return qr;
- }
- }
//compass支持增量索引,社会上很多公司,他们的产品都没有实现增量索引,1>lucene版本比较低,不支持增量索引,2>要增量索引,技术要求稍微有点高
//(晚上 2-3,定时器,把索引文件删除,重新生成索引)实时性不强,在索引文件更新的时候,用户是访问不了的
以上基本都为讲解,下面是具体的开发步骤:
步骤一:
导jar:compass的两个文件,疑问logging文件一般我们已经存在了,lucene的六个文件
步骤二:
配置映射元数据:
设计实体,我们实体已经存在了,所以不用设计了,直接加注解
我们映射产品:
首先我们要加上搜索id
然后我们要分析一下那些是需要搜索的,哪些是不需要搜索的,但是需要显示在搜索结果中的。如果不需要显示也不需要索引就不管他
第三步:
我们对索引进行填、删、查
我们对产品进行保存的时候,我们就应该把索引也保持进去。
方式一:我们可以重写我们servicebean的保持方法。添加一个保存到索引里面去的方法。这样我们就存在一个问题,两个保存,有一个保存失败了,另一个保存就无法执行。就导致了数据不同,无法保证两种保存在同一个事物中
方式二:把compass集成到spring中,让他使用spring的事物管理功能。
在我们的spring中添加代码如下:
- <bean id= "compass" class = "org.compass.spring.LocalCompassBean" >
- <property name="classMappings" >
- <list>
- <value>cn.itcast.bean.product.ProductInfo</value>
- <value>cn.itcast.bean.product.Brand</value>
- <value>cn.itcast.bean.product.ProductStyle</value>
- <value>cn.itcast.bean.product.ProductType</value>
- </list>
- </property>
- <property name="compassSettings" >
- <props>
- <prop key="compass.engine.analyzer.default.type" >net.paoding.analysis.analyzer.PaodingAnalyzer</prop>
- <prop key="compass.engine.connection" >file: //d:/index</prop>
- <!-- 在内存中建立索引
- <prop key="compass.engine.connection" >ram: //index</prop>
- -->
- <prop key="compass.engine.highlighter.default.formatter.simple.pre" ><![CDATA[<font color= 'red' >]]></prop>
- <prop key="compass.engine.highlighter.default.formatter.simple.post" ><![CDATA[</font>]]></prop>
- <prop key="compass.transaction.factory" >org.compass.spring.transaction.SpringSyncTransactionFactory</prop>
- </props>
- </property>
- <property name="transactionManager" ref= "transactionManager" />
- </bean>
引自:http://osacar.iteye.com/blog/1050977 多谢
相关推荐
描述中的链接指向了 CSDN 博客上的一篇文章,虽然具体内容无法在当前环境中查看,但我们可以推测这篇文章可能讲述了如何在 Spring 应用中集成 Compass 和 Hibernate,实现全文检索功能。通常,这样的集成会包括以下...
标签“compass_hibernate_spring3.zip”再次确认了压缩包的内容,可能包含了一个完整的示例项目,展示如何在 Spring 3 应用中配置和使用 Compass 与 Hibernate 的集成。 压缩包内的单一文件“compass_hibernate_...
标题 "整合compass2.0 spring hibernate示例源程序" 提供了我们即将探讨的核心内容,即一个结合了Compass 2.0、Spring和Hibernate的集成示例。这个项目旨在展示如何在Java应用程序中有效地利用这三个强大的开源框架...
《 Compass、Hibernate与Spring的整合应用详解 》 在现代企业级Java开发中,数据持久化是不可或缺的一部分,而Hibernate作为流行的ORM(对象关系映射)框架,极大地简化了数据库操作。然而,对于复杂的搜索需求,...
你需要下载并添加compass库的jar文件,然后配置Compass的连接器,使其与Hibernate集成。这样,当Hibernate进行数据操作时,Compass会自动更新索引。在Spring配置中,你可以声明一个CompassTemplate bean,它提供了与...
标题 "compass-2.2.0+hibernate-3.2+struts-2.1.8.1+spring-framework-2.5.4" 指的是一个集成开发环境,它结合了四个关键的技术组件:Compass、Hibernate、Struts 2 和 Spring Framework,这些都是Java Web开发中的...
标题 "spring + hibernate + struts2 + compass2.1" 暗示了这是一个关于构建基于Java的Web应用程序的经典组合。在这个框架中,Spring作为核心的依赖注入(DI)和面向切面编程(AOP)容器,Hibernate是用于对象关系...
Struts2、Hibernate、Spring 和 Compass 是Java Web开发中四个重要的框架和技术,它们共同构建了一个强大的企业级应用架构。在本项目中,开发者利用SSH2(即Struts2、Hibernate和Spring的组合)作为基础框架,并引入...
Compass为Spring提供了良好的集成支持,类似Spring对Hibernate的集成。CompassTemplate是简化操作的重要工具,如Session、Transaction和Exception处理。例如,可以通过Spring上下文获取`CompassTemplate`,然后使用...
通过Spring,可以轻松地将其他框架如Hibernate集成进来,实现服务层和持久层的解耦。 3. **HIBERNATE**:Hibernate是一个流行的ORM(对象关系映射)框架,它简化了Java应用与数据库之间的交互。Hibernate通过映射...
4. **配置Spring**:将Compass和Hibernate集成到Spring中,使用Spring管理Compass实例和事务。 5. **编写搜索服务**:创建服务接口和实现,使用Compass的API执行搜索查询。 6. **测试和优化**:测试搜索功能是否...
标题中的“compass+ssh2集成 hibernategps问题”指的是在Java开发中,开发者尝试将Compass搜索引擎库与SSH2(Spring、Struts和Hibernate)框架整合时遇到的问题,特别是与Hibernate的GPS(Global Persistent ...
通过以上步骤和技巧,我们可以将Compass有效地集成到Struts2、Spring和Hibernate的环境中,实现高效、强大的全文搜索功能。这将极大地提升Web应用的用户体验,特别是对于内容丰富的网站或信息管理系统,全文搜索功能...
在本项目中,"JAVA 全文搜索 struts2+spring+hibernate+compass整合记录" 是一个关于如何在Java环境下集成四个关键组件来实现全文搜索引擎的实践教程。Struts2是一个流行的MVC框架,Spring是核心的依赖注入框架,...
Struts、Hibernate、Spring、JPA、Lucene、JBPM和Compass是Java开发中常用的一系列技术,它们各自在不同的领域发挥着重要作用。这里我们将深入探讨这些技术以及如何将它们整合在一起进行配置。 1. **Struts**:...
本项目是一个基于Java技术栈,整合了Hibernate、Spring JPA以及Compass的图书商城系统,提供了全面的功能,适合用于课程设计、大作业、毕业设计、项目练习或学习演示。下面将详细阐述该项目所涉及的技术点及其重要性...
Compass与Spring的集成相当紧密,提供了与Spring对Hibernate支持类似的便利性。CompassTemplate是其中的关键组件,它简化了Session、Transaction和Exception处理,极大地提高了开发效率。例如,在Spring环境中,可以...