- 浏览: 372202 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (148)
- java (89)
- flex (7)
- sns (3)
- jquery mobile gwt html5 (1)
- VirtualBox Centos 安装 (2)
- tomcat (1)
- nginx (2)
- centOS (7)
- memcache (2)
- hadoop (3)
- hbase (3)
- install (1)
- cloudera (3)
- tools (0)
- gen code (0)
- Mysql (2)
- KinderEditor (1)
- flash chart (1)
- ntsysv (1)
- hibernate search (2)
- compass (1)
- lucence (2)
- hibernate (1)
- jboss cache (0)
- 二级缓存 (1)
- maven (1)
- debian (1)
- go (1)
- golang (2)
- html5 (1)
最新评论
-
llh1985:
wave牛人~~求联系~~~邮箱llh1985@163.com ...
GWT Wave 开源代码运行跑通分析(1) -
zhengliming123:
[img][img][*][*][/flash][*]|[/i ...
hibernate Search 学习研究 附件是maven工程 -
di1984HIT:
写得很嗯好啊。
CentOS 安装 hadoop hbase 使用 cloudera 版本。(一) -
itfanr:
楼主写的真好 本地godoc
Golang 1.0 文档使用。godoc ,go 命令 学习 ,本地运行 gotour -
phe441:
灰常感谢楼主,爱死你了
URL rewrite 3.2 jar 和 文档 pdf 下载
Jboss 的 hibernate search 支持 hibernate 应该比较好。
所以想在项目 里面使用 hibernate search 进行 搜索。
分词使用的是 IKAnalyzer
网站是 :
http://code.google.com/p/ik-analyzer/
使用的 是 hibernate 3.6.8 + spring 3.0.6 + hibernate search 3.4.1 +IKAnalyzer 3.2.8
数据库是mysql 链接池是 c3p0
在 hibernate search 3.4 版本的时候 就不需要配置 hibernate 的监听了。(Jboss 自家的东西支持就是好点)
下面是配置文件:
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="dataSource"> <ref bean="dataSource" /> </property> <property name="packagesToScan"> <list> <value>com.freewebsys</value> </list> </property> <!-- <property name="mappingDirectoryLocations"> <list> <value>classpath:com/**/pojo</value> </list> </property> --> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">${hibernate.dialect}</prop> <!-- <prop key="hibernate.dialect"> org.hibernate.dialect.Oracle9Dialect </prop> <prop key="hibernate.dialect"> org.hibernate.dialect.MySQLDialect </prop> --> <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop> <prop key="cglib.use_reflection_optimizer">true</prop> <prop key="hibernate.show_sql">${hibernate.show_sql}</prop> <prop key="hibernate.jdbc.fetch_size">${hibernate.jdbc.fetch_size}</prop> <prop key="hibernate.jdbc.batch_size">${hibernate.jdbc.batch_size}</prop> <prop key="hibernate.cache.use_query_cache">${hibernate.cache.use_query_cache}</prop> <!-- <prop key="hibernate.cache.provider_class">${hibernate.cache.provider_class} </prop> --> <prop key="hibernate.query.substitutions">true 1, false 0, yes 'Y', no 'N'</prop> <!-- add hibernate search. --> <prop key="hibernate.search.default.directory_provider">${hibernate.search.default.directory_provider}</prop> <prop key="hibernate.search.default.indexBase">${hibernate.search.default.indexBase}</prop> <prop key="hibernate.search.analyzer">${hibernate.search.analyzer}</prop> </props> </property> </bean>
<property name="packagesToScan">这个属性直接可以把配置下面的java bena 读取出来。不用一条一条添加了。
然后就是配置 hiberante 事物。
<!-- ####下面是用spring对事务进行配置的代码.#####开始 --> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory"> <ref bean="sessionFactory" /> </property> </bean> <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate"> <property name="sessionFactory"> <ref bean="sessionFactory" /> </property> <property name="cacheQueries"> <value>true</value> </property> </bean> <bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor"> <property name="transactionManager" ref="transactionManager" /> <property name="transactionAttributes"> <props> <prop key="*">PROPAGATION_REQUIRED,-Exception</prop> <prop key="find*">PROPAGATION_REQUIRED,readOnly </prop> <prop key="list*">PROPAGATION_REQUIRED,readOnly </prop> <prop key="get*">PROPAGATION_REQUIRED,readOnly </prop><!-- find和get方法开头的是只读的事务,其他的都进行提交回滚. --> </props> </property> </bean> <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> <property name="beanNames"> <value>*Service</value> <!-- <value>*Mgr, *Service , *Director , *Outputter , importTask</value> 这个是通过对事务进行批量配置.对bean的名字含有Service的统统进行事务配置. 这样严格控制业务逻辑在service实现.如果有在action层进行查询的无所谓.但是 保持更新在action是绝度不行的. --> </property> <property name="interceptorNames"> <list> <value>transactionInterceptor</value> </list> </property> </bean> <bean class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor"> <property name="transactionInterceptor" ref="transactionInterceptor" /> </bean> <!-- Auto scan the components --> <context:component-scan base-package="com.freewebsys" />
创建搜索的 bean
package com.freewebsys.demo.pojo; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import static javax.persistence.GenerationType.IDENTITY; import javax.persistence.Id; import javax.persistence.Table; import javax.persistence.UniqueConstraint; import org.hibernate.search.annotations.Analyzer; import org.hibernate.search.annotations.DocumentId; import org.hibernate.search.annotations.Field; import org.hibernate.search.annotations.Index; import org.hibernate.search.annotations.Indexed; import org.hibernate.search.annotations.Store; import org.wltea.analyzer.lucene.IKAnalyzer; @Entity @Table(name = "user_info") @Indexed public class UserInfo implements java.io.Serializable { private Long id; private String userName; private String passwd; private String city; private String content; public UserInfo() { } @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id", unique = true, nullable = false) @DocumentId public Long getId() { return id; } public void setId(Long id) { this.id = id; } @Column(name = "user_name", unique = false, nullable = true, length = 100) @Field(name = "user_name", index = Index.TOKENIZED, store = Store.YES) public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } @Column(name = "passwd", unique = false, nullable = true, length = 100) @Field(name = "passwd", index = Index.TOKENIZED, store = Store.YES) public String getPasswd() { return passwd; } public void setPasswd(String passwd) { this.passwd = passwd; } @Column(name = "city", unique = false, nullable = true, length = 100) @Field(name = "city", index = Index.TOKENIZED, store = Store.YES) public String getCity() { return city; } public void setCity(String city) { this.city = city; } @Column(name = "content", unique = false, nullable = true, length = 4000) @Field(name = "content", index = Index.TOKENIZED, store = Store.YES, analyzer = @Analyzer(impl = IKAnalyzer.class)) public String getContent() { return content; } public void setContent(String content) { this.content = content; } @Override public String toString() { return "UserInfo [id=" + id + ", userName=" + userName + ", passwd=" + passwd + ", city=" + city + ", content=" + content + "]"; } }
@Indexed 标识这个要被索引。
@Field(name = "user_name", index = Index.TOKENIZED, store = Store.YES)
标识 索引字段
@Field(name = "content", index = Index.TOKENIZED, store = Store.YES, analyzer = @Analyzer(impl = IKAnalyzer.class))
具体 其他参数 参考 博客 : http://sin90lzc.iteye.com/blog/1106258
标识索引字段并表示分词 为 IKAnalyzer
然后 就是 service 写的。。这里 省略了 dao 层 service 直接 继承 HibernateDaoSupport
package com.freewebsys.demo.service.impl; import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.SimpleAnalyzer; import org.apache.lucene.analysis.StopAnalyzer; import org.apache.lucene.queryParser.ParseException; import org.apache.lucene.queryParser.QueryParser; import org.apache.lucene.search.highlight.Highlighter; import org.apache.lucene.search.highlight.QueryScorer; import org.apache.lucene.search.highlight.SimpleFragmenter; import org.apache.lucene.search.highlight.SimpleHTMLFormatter; import org.apache.lucene.util.Version; import org.hibernate.Query; import org.hibernate.SessionFactory; import org.hibernate.search.FullTextQuery; import org.hibernate.search.FullTextSession; import org.hibernate.search.Search; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.wltea.analyzer.lucene.IKAnalyzer; import com.freewebsys.demo.pojo.UserInfo; import com.freewebsys.demo.service.UserInfoService; @Service("userInfoService") public class UserInfoServiceImpl extends HibernateDaoSupport implements UserInfoService { private static Log log = LogFactory.getLog(UserInfoServiceImpl.class); @Autowired public void setMySessionFactory(SessionFactory sessionFactory) { setSessionFactory(sessionFactory); } @Transactional public void save(UserInfo userInfo) { getHibernateTemplate().save(userInfo); } @Transactional public void delete(UserInfo userInfo) { getHibernateTemplate().delete(userInfo); } /** * 使用hql 进行查询。 */ @Transactional public List<UserInfo> findUserInfo(String userName) { String hql = " from UserInfo userInfo where userInfo.userName = ? "; return getHibernateTemplate().find(hql, userName); } public List<UserInfo> findUserInfoBySearchContent(String content) { FullTextSession fullTextSession = Search .getFullTextSession(getSession()); QueryParser parser = new QueryParser(Version.LUCENE_31, "content", new SimpleAnalyzer(Version.LUCENE_31)); org.apache.lucene.search.Query luceneQuery = null; try { luceneQuery = parser.parse(content); } catch (ParseException e) { e.printStackTrace(); } FullTextQuery fullTextQuery = fullTextSession.createFullTextQuery( luceneQuery, UserInfo.class); List<UserInfo> useList = (List<UserInfo>) fullTextQuery.list(); // 高亮设置 SimpleHTMLFormatter formatter = new SimpleHTMLFormatter( "<b><font color='red'>", "</font></b>"); QueryScorer qs = new QueryScorer(luceneQuery); Highlighter highlighter = new Highlighter(formatter, qs); // 这个20是指定关键字字符串的context的长度,你可以自己设定,因为不可能返回整篇正文内容 highlighter.setTextFragmenter(new SimpleFragmenter(20)); for (UserInfo userInfo : useList) { Analyzer analyzer = new IKAnalyzer(); try { String contentHighLighter = highlighter.getBestFragment( analyzer, content, userInfo.getContent()); System.out.println(contentHighLighter); userInfo.setContent(contentHighLighter); } catch (Exception e) { e.printStackTrace(); } } return useList; } /** * 查询全部数据 */ public List<UserInfo> findAllUserInfo() { String hql = " from UserInfo userInfo"; return getHibernateTemplate().find(hql); } }
最关键的就是搜索 然后 显示 高亮并 将文章内容截取 。
也可以使用setFirstResult setMaxResults 对搜索进行分页。
fullTextQuery.getResultSize() 是获得总页数。
fullTextQuery.setFirstResult((pageNo - 1) * pageSize); fullTextQuery.setMaxResults(pageSize);
在使用 高亮显示的时候 二次进行了 分词。找到 查询内容:
// 高亮设置 SimpleHTMLFormatter formatter = new SimpleHTMLFormatter( "<b><font color='red'>", "</font></b>"); QueryScorer qs = new QueryScorer(luceneQuery); Highlighter highlighter = new Highlighter(formatter, qs); // 这个20是指定关键字字符串的context的长度,你可以自己设定,因为不可能返回整篇正文内容 highlighter.setTextFragmenter(new SimpleFragmenter(20)); for (UserInfo userInfo : useList) { Analyzer analyzer = new IKAnalyzer(); try { String contentHighLighter = highlighter.getBestFragment( analyzer, content, userInfo.getContent()); System.out.println(contentHighLighter); userInfo.setContent(contentHighLighter); } catch (Exception e) { e.printStackTrace(); } } return useList;
在test 里面是测试 先初始化 数据库。
还可以对 数据里面的html 代码去掉。然后再展示:
QueryScorer qs = new QueryScorer(luceneQuery); Highlighter highlighter = new Highlighter(formatter, qs); // 这个20是指定关键字字符串的context的长度,你可以自己设定,因为不可能返回整篇正文内容 highlighter.setTextFragmenter(new SimpleFragmenter(20)); String contentStr = null; for (UserInfo userInfo : useList) { Analyzer analyzer = new IKAnalyzer(); try { contentStr = userInfo.getContent(); // 去掉所有html元素, contentStr = contentStr.replaceAll("<[a-zA-Z]+[1-9]?[^><]*>", "").replaceAll("</[a-zA-Z]+[1-9]?>", ""); String contentHighLighter = highlighter.getBestFragment( analyzer, content, contentStr); System.out.println(contentHighLighter); userInfo.setContent(contentHighLighter); } catch (Exception e) { e.printStackTrace(); } }
运行junit 测试:
List<UserInfo> list = userInfoService .findUserInfoBySearchContent("三个月"); System.out.println(list.size()); System.out.println("Finish ########"); for (UserInfo userInfo : list) { System.out.println(userInfo); }
查询结果如下:
<b><font color='red'>三个月</font></b>必须到杭州进行全身心开发,<b><font color='red'>三个月</font></b>之后 <b><font color='red'>三个月</font></b>可以全身心在杭州专注于项目开发。<b><font color='red'>三个月</font></b> 开发的<b><font color='red'>三个月</font></b>内,天使湾将在杭州每周举办分享 <b><font color='red'>三个月</font></b>内,不同创业团队在确保独立自主的 地。在杭州<b><font color='red'>三个月</font></b>期间创业团队的住宿餐饮 <b><font color='red'>三个月</font></b>绝对以一当十! 9.天使湾聚变
到页面就可以显示 高亮并 截取字符串了。
目前有一个问题就是 查询的时候 同时也执行 sql 查询。
如执行:
Hibernate: select this_.id as id0_0_, this_.city as city0_0_, this_.passwd as passwd0_0_, this_.user_name as user4_0_0_ from user_info this_ where (this_.id in (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?))
将 搜索查询 到的数据 从数据库中提取出来。
总的来说 hibernate search 将 搜索简化了很多。
附件是 工程代码:
- demo.hibernate_search.2011.11.29.zip (3.8 MB)
- 下载次数: 159
评论
- [img][img]
[*]
[/img][/img][*]
|[/flash] [*]
全文检索还是什么?
是lucence 的全文检索。
只不过是用了下 hibernate search 进行了封装下。简单快速实现功能。
全文检索还是什么?
相关推荐
这个【hibernate+maven demo项目工程】是一个很好的学习资源,它涵盖了Maven的基本使用、Hibernate的配置与操作,以及如何组织Java项目结构。通过深入研究此项目,开发者可以更好地掌握这两项技术,并将其应用于实际...
使用Maven导入Maven工程的视频教程 仅供学习交流! 后续会持续分享相关资源,记得关注哦! 使用Maven导入Maven工程的视频教程 使用Maven导入Maven工程的视频教程 使用Maven导入Maven工程的视频教程 使用Maven导入...
在Java Web开发中,Maven、Hibernate5以及反向工程是三个重要的概念,它们共同协助开发者高效地构建和管理项目。下面将详细解释这些知识点。 **Maven** 是一个项目管理和综合工具,它帮助Java开发者管理项目的构建...
压缩包包括项目完整代码,详细说明和项目结构图,效果图 项目实现了分页和高亮显示 MAVEN项目:HibernateSearchDemo IDE :MyEclipse jdk :1.6 数据库 :MySql ...hibernate search 版本 4.4.1.Final
【Maven】 Maven是Java开发中的一个项目管理和综合工具,它可以帮助开发者构建、管理和部署项目。Maven通过使用一种标准的项目对象模型(Project Object Model,POM),能够自动化构建过程,包括编译、测试、打包、...
通过学习和实践这个项目,开发者可以深入理解Spring MVC、Hibernate和Maven的集成,提升Java Web开发能力。同时,这个项目也是进一步探索其他Java Web技术,如Spring Boot、MyBatis等的良好起点。
搭建 Maven 工程是 Java 开发者的必备技能。本文将指导读者从无到有搭建一个 Maven 工程,包括创建多模块工程、子模块的建立、修改父、子文件、目录结构的调整等内容。 创建 Maven 多模块工程 Maven 多模块工程是...
SSH整合指的是Spring、Struts和Hibernate这三大Java开源框架的集成应用。这三大框架分别负责控制层、视图层和持久层,它们的结合能够构建出功能强大的企业级Web应用程序。 Spring框架是整个SSH整合的核心,它提供了...
在现代Java开发中,Maven和Hibernate5是两个不可或缺的工具。Maven是一个项目管理和集成工具,它简化了构建、依赖管理和项目的标准化过程。而Hibernate5则是一个强大的对象关系映射(ORM)框架,它允许开发者用Java...
本学习资源包“java maven工程 spring boot 学习源码”提供了一个可以直接运行的示例工程,有助于深入理解Spring Boot和Maven的结合使用。 首先,我们需要了解Spring Boot的核心特性。Spring Boot通过内嵌的Servlet...
spring4+hibernate4+spring4+maven(带数据库,可以运行:删查增)改的,我就不行,三种功能都可以运行。我也是网上找别人的资源,然后自己搭建起来的。我很很多朋友都想找这样的资源,但是会出现各种问题,我知道...
通常,这涉及到在`pom.xml`(如果你的项目是Maven)或`build.gradle`(如果是Gradle)文件中添加Hibernate Search和Lucene库。例如: ```xml <groupId>org.hibernate <artifactId>hibernate-search-orm ...
**标题解析:**“hibernate Maven仓库资源”这一标题表明了我们关注的是关于Hibernate框架在Maven项目中的使用。Hibernate是一个流行的Java持久化框架,它简化了数据库操作,使得开发者能够更方便地管理和操作数据库...
标题中的"idea工具创建的Spring+SpringMVC+Hibernate+maven项目"指的是使用IntelliJ IDEA这个集成开发环境(IDE)构建的一个Java Web项目,该项目整合了四个关键的技术框架:Spring、SpringMVC、Hibernate以及Maven...
在本项目"maven项目...这个项目实例为初学者提供了一个学习Maven和Hibernate的实践平台,同时也适用于有一定经验的开发者参考和复用。通过这个demo,你可以深入了解Java Web应用的开发流程和现代ORM框架的使用方法。
在现代Java Web开发中,"Maven整合Spring+SpringMVC+Hibernate+SpringDataJPA"是一个常见的架构组合,被广泛应用于构建企业级应用程序。这个组合通常被称为"SSM",其中"M"代表Maven,"S"代表Spring,包括Spring核心...
SpringMVC、Hibernate、Maven和AngularJS是四个在现代Web开发中至关重要的技术栈,它们各自扮演着不同的角色,共同构建了一个高效、模块化的Web应用程序。在这个名为"mvch_case"的项目中,我们可以看到这四者的整合...
** Maven Hibernate 项目详解 ** 在Java开发领域,Maven和Hibernate是两个不可或缺的工具。Maven是一款项目管理和综合工具,它帮助开发者管理构建过程、依赖关系和项目信息,而Hibernate则是一个流行的对象关系映射...
** Maven 搭建 SpringMVC + Hibernate 框架详解 ** 在现代软件开发中,Maven 是一个强大的项目管理工具,它帮助开发者管理构建过程、依赖关系和项目信息。SpringMVC 和 Hibernate 则是两个流行的技术,分别用于构建...
标题 "maven+hibernate" 暗示我们讨论的是使用 Maven 作为构建工具,与 Hibernate 这一流行的对象关系映射(ORM)框架整合的项目。在Java开发中,Maven 和 Hibernate 是两个非常重要的组件。Maven 用于自动化项目的...