`
hz_chenwenbiao
  • 浏览: 993639 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

基于Spring的Hibernate Search全文检索功能(转)

阅读更多

      最近的一个项目正好运用了Hibernate Search 的全文检索功能,所以就研究了一下。通过一小段的简单研究终于在项目俩面运用了起来。所以来简单记录一下。希望能对大家有所帮助。

首先来几个概念吧。:)

Hibernate Search 是什么?

 

       我的理解 hibernate search 就是hibernate里面一个基于lucence开发的全文检索功能模块。

 

Hibernate Search项目的主要特性包含以下几个方面: 
       1.Lucene集成——作为强大高效的检索引擎,Lucene的美名早已久经考验了;

       2.数据的自动插入和更新——当一个对象通过Hibernate添加或更新时,索引也会相应进行透明的更新;

       3.支持众多复杂的搜索方式——可快速的使用通配符进行搜索,以及多关键词全文检索(multi-word text searches)和近似或同义词搜索(approximation/synonym searches),或根据相关性排列搜索结果;

       4.搜索集群(Search Clustering)——Hibernate Search提供了内建搜索集群解决方案,其中包括一个基于JMS的异步查询和索引系统;

       5.对Lucene API接口的直接调用——如果用户打算处理某些特别复杂的问题,可以在查询中直接使用Lucene提供的API接口;

       6.对Lucene的自动管理——Hibernate Search可以管理并优化Lucene的索引,并且非常高效地使用Lucene的API接口。

Hibernate Search相关的Annotation主要有三个: 

  • @Indexed    标识需要进行索引的对象,              属性 :       index         指定索引文件的路径
  • @DocumentId  用于标示实体类中的唯一的属性保存在索引文件中,是当进行全文检索时可以这个唯一的属性来区分索引中其他实体对象,一般使用实体类中的主键属性
  • @Field          标注在类的get属性上,标识一个索引的Field               属性 :      index         指定是否索引,与Lucene相同 
        store         指定是否索引,与Lucene相同 
        name        指定Field的name,默认为类属性的名称 
        analyzer    指定分析器
  • 另外@IndexedEmbedded  与  @ContainedIn 用于关联类之间的索引
  • @IndexedEmbedded有两个属性,一个prefix指定关联的前缀,一个depth指定关联的深度 

在maven的pom.xml文件中加入以下几个依赖包

<dependency>  
    <groupId>org.hibernate</groupId>  
    <artifactId>hibernate-search</artifactId>  
    <version>3.1.0.GA</version>  
</dependency>  
<dependency>  
    <groupId>org.hibernate</groupId>  
    <artifactId>hibernate-annotations</artifactId>  
    <version>3.4.0.GA</version>  
</dependency>    
<dependency>  
    <groupId>org.slf4j</groupId>  
    <artifactId>slf4j-nop</artifactId>  
    <version>1.5.2</version>  
</dependency>  
<!-- hibernate framework end -->  
     
<!-- lucene start -->  
<dependency>  
    <groupId>org.apache.lucene</groupId>  
    <artifactId>lucene-analyzers</artifactId>  
    <version>2.4.0</version>  
</dependency>  
<dependency>  
    <groupId>org.apache.lucene</groupId>  
    <artifactId>lucene-highlighter</artifactId>  
    <version>2.4.0</version>  
</dependency>  

 在spring的配置文件中加入如下hibernate searhch 的配置

<property name="hibernateProperties">  
            <props>  
                <prop key="hibernate.connection.autocommit">true</prop>  
                <prop key="hibernate.show_sql">true</prop>  
                <prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect  
                </prop>  
                <prop key="hibernate.query.factory_class"> org.hibernate.hql.ast.ASTQueryTranslatorFactory  
                </prop>  
                <prop key="hibernate.search.default.directory_provider"> org.hibernate.search.store.FSDirectoryProvider  
                </prop>  
                <prop key="hibernate.search.worker.batch_size"> 1000</prop>  
                <prop key="hibernate.search.default.indexBase"> d:/index</prop>  
                <prop key="hibernate.search.analyzer"> org.apache.lucene.analysis.cjk.CJKAnalyzer</prop>  
            </props>  
</property>  
<property name="eventListeners">  
            <map>  
                <entry key="post-update">  
                    <bean class="org.hibernate.search.event.FullTextIndexEventListener" />  
                </entry>  
                <entry key="post-insert">  
                    <bean class="org.hibernate.search.event.FullTextIndexEventListener" />  
                </entry>  
                <entry key="post-delete">  
                    <bean class="org.hibernate.search.event.FullTextIndexEventListener" />  
                </entry>  
            </map>  
</property>  
 以上配置包括了建立索引批量提交设置,索引文件生成的位置,还有建立索引的时候的词法分析器的制定。

还有就是事件监听的配置。上面的配置目的是针对所以对象的增删该查自动监听并建立索引文件。

下面简单建立一个pojo的 索引配置

@Entity  
@Table(name="B2C_COMMODITY")  
@Indexed(index="newindexs/commodity")  
@SuppressWarnings("serial")  
public class B2cCommodity  implements java.io.Serializable {  
  
 private String id;  
 private String commodityNo;  
 private String commodityName;  
 private String introduction;  
 private String keyword;  
 private BigDecimal sellPrice;  
  
@Id  
@Column(name="id",length=32)  
@GeneratedValue (generator="UUDI_KEY")  
@GenericGenerator(name="UUDI_KEY", strategy="uuid.hex")  
    public String getId() {  
        return this.id;  
    }  
      
    public void setId(String id) {  
        this.id = id;  
    }  
  
@Transient  
@Field(index=Index.TOKENIZED)  
public String getContent() {  
return  this.commodityName+" "+this.introduction+" "+this.keyword;  
}  
      
@Transient  
@Field(index=Index.UN_TOKENIZED)  
public String getIndexedSellPrice() {//用于索引的商品售价  
        String tmp = this.getSellPrice().toString();  
        return SearchUtil.makeIndexedPrice(tmp);  
}  
  
@Column(name="COMMODITY_NAME", nullable=false, length=300)  
    public String getCommodityName() {  
        return this.commodityName;  
    }  
      
    public void setCommodityName(String commodityName) {  
        this.commodityName = commodityName;  
    }  
  
    @Column(name = "INTRODUCTION", length = 9000000)  
    public String getIntroduction() {  
        return this.introduction;  
    }  
      
    public void setIntroduction(String introduction) {  
        this.introduction = introduction;  
    }  
  
@Column(name="SELL_PRICE", nullable=false, precision=18)  
    public BigDecimal getSellPrice() {  
        return this.sellPrice;  
    }  
      
    public void setSellPrice(BigDecimal sellPrice) {  
        this.sellPrice = sellPrice;  
    }  
@Column(name="KEYWORD", length=200)  
    public String getKeyword() {  
        return this.keyword;  
    }  
      
    public void setKeyword(String keyword) {  
        this.keyword = keyword;  
    }  
  
}  
 看到上面的配置大家可能有些疑问 ,我没有在原有的数据库列上面直接建立索引,而是将原有的多个列建立在了一个 content 列上。

这是为了解决多条件符合查询的时候的一个简便方法,例如我输入关键字 “男装” 我既想搜索 标题 又想所有 内容,还想搜索 介绍。那么我将这三个字段组合在一起建立一个content索引。在搜索的时候直接搜索 content 字段就可以了。而不用再麻烦 hibernate search 的 MultiFieldQueryParser 出入多个条件查询多个索引列了。只要查询一个就可以了。

上面的配置就设置基本完成了

/** 
     * 测试建立索引,配置了事件监听后根据增删改查自动更新索引文件 
     * @return 
     */  
    @RequestMapping("/view/testMakeIndex.htm")  
    public String testMakeIndex(){  
            B2cCommodity obj = new B2cCommodity();  
            obj.setCommodityNo("123456789");  
            obj.setCommodityName("测试");  
            obj.setIntroduction("测试lucence程序");  
            obj.setStoreId("00000121");  
            obj.setSellPrice(new BigDecimal("10"));  
            obj.setOnShelf("1");  
            obj.setCommodityNumber(100);  
            obj.setFreezeStatus('1');  
            obj.setDelFlag('1');  
            obj.setRegRegionId("000001");  
            obj.setCreateBy("ylm");  
            obj.setCreateTime(new Date());  
            commodityDAO.saveCommodity(obj);  
        return "/view/testIndexSearch.htm";  
    }  
 只要跟平常运用hibernate pojo 操作增删该查数据库一样 就可以自动更新索引文件了

查询所以文件测试代码如下:

/** 
     * 测试查询索引文件 
     * @return 
     * @throws ParseException 
     */  
    @RequestMapping("/view/testIndexSearch.htm")  
    public String testIndexSearch() throws ParseException{  
          
            FullTextSession fullTextSession = Search.createFullTextSession(commodityDAO.getSessionFactory().openSession());     
            MultiFieldQueryParser parser = new MultiFieldQueryParser(new String[] {"content" }, new StandardAnalyzer());     
            org.apache.lucene.search.Query luceneQuery = parser.parse("测试");     
            FullTextQuery query = fullTextSession.createFullTextQuery(luceneQuery,B2cCommodity.class);     
            // 添加分页查询     
            query.setFirstResult(0);     
            query.setMaxResults(100);     
            // 对查询结果按name进行排序     
            List result = query.list();   
        return "/view/testIndexSearch.htm";  
    }  
 以上是一个简单的配置和测试的例子
分享到:
评论

相关推荐

    基于Spring的Hibernate Search全文检索功能示例

    基于Spring的Hibernate Search全文检索功能示例 实例下载

    中文分词检索IKAnalyzer3.2.3Stable+hibernate-search3.4.0.Final

    中文分词检索IKAnalyzer3.2.3Stable+spring3.0.5+hibernate3.6.7+hibernate-search3.4.0.Final+maven hibernate-search3.4.0用的是lucene3.1

    SpringMVC、Mybatis、Hibernate、Bootstrap、jQuery、HTML5、SpringSecurity、Lucene、Ehcache

    Spring 4.1.5(管理事务)、Spring MVC 4.1.5(作为控制层)、Spring Security 4.0.0(认证和授权,权限管理)、Hibernate 4.3.8(作为数据持久层)、MyBatis 3.2.8(作为数据持久层)、Hibernate Search 5.1.0(全文检索)、...

    jblog:一个简洁漂亮的Java博客,基于Spring MVC + Hibernate + MySQL + Bootstrap + freemarker。实现

    通过Spring / MVC + Hibernate + Hibernate-search + MySQL + Bootstrap + freemarker实现的多用户博客系统。 项目部署图 现在部署在 框架选型 功能组成图 现有功能 泛型域名访问个人主页:用户名.51so.info 响应式...

    HTML5+Bootstrap

    HTML5 + jQuery + Spring 4.1.5(管理事务) + Spring MVC 4.1.5(作为控制层) + Spring Security 4.0.0(认证和授权,权限管理) + Hibernate 4.3.8(作为数据持久层) + Hibernate Search 5.1.0(全文检索) + Ehcache ...

    MF00001-JAVA多用户B2B2C商城源码.zip

    全文检索: Lucene3.5.0、HibernateSearch3.6.6 模板视图: Velocity1.5、HTML、CSS、JQuery1.8.3 权限控制: SpringSecurity2.0.4 使用Spring+JPA+Velocity+Ehcache作为基础开发架构,应用SpringSecurity框架...

    积分管理系统java源码-wemall:b2b2c平台电商

    积分管理系统java源码 xmall B2B2C多用户商城系统 介绍 xmall是采用Java语言开发的多...Lucene、HibernateSearch 模板视图: Velocity、HTML、CSS、JQuery 权限控制: SpringSecurity 技术特点 基于Java语言开发,融合

    开源bbs源码java-BBS:Hiskey的论坛

    Hibernate-Search5.8.0 Freemarker Sqlite(或MySQL) Bootstrap3 Ehcache 呃,就是spring全家桶 特性 社区兼容性(IE9+) 页面自适应布局 本地登录,注册 登录时有验证码,尝试登录次数的限制 使用 Spring-Boot 开发 ...

    开源bbs源码java-NEW-BBS:新购物

    Hibernate-Search5.8.0 Freemarker Sqlite(或MySQL) Bootstrap3 Ehcache 呃,就是spring全家桶 特性 社区兼容性(IE9+) 页面自适应布局 本地登录,注册 登录时有验证码,尝试登录次数的限制 使用 Spring-Boot 开发 ...

    Lerx 网站内容管理系统 v5.5.zip

    Lerx 网站内容管理系统是一套开源免费的基于Java环境的,采用Spring 4和Hibernate 5 开发的各类门户网站内容管理。采用了低耦合式模块化设计。拥有版本更新自动提醒、智能网站模板市场、文件上传防重、智能裁剪等等...

    JAVA上百实例源码以及开源项目

     基于EJB的真实世界模型,附源代码,部分功能需JSP配合完成。 J2ME优化压缩PNG文件 4个目标文件 内容索引:JAVA源码,综合应用,J2me游戏,PNG,图形处理  这是个J2ME控制台程序,它能剔除PNG文件中的非关键数据段,...

    JAVA上百实例源码以及开源项目源代码

    基于EJB的真实世界模型,附源代码,部分功能需JSP配合完成。 J2ME优化压缩PNG文件 4个目标文件 内容索引:JAVA源码,综合应用,J2me游戏,PNG,图形处理 这是个J2ME控制台程序,它能剔除PNG文件中的非关键数据段,减少...

    java开源包1

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    java开源包11

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    java开源包2

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    java开源包3

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

Global site tag (gtag.js) - Google Analytics