Hibernate Search, Lucene 与 JBoss Seam

翻译 2008年09月28日 17:36:00
 

原文地址:http://www.abstractec.co.uk/blog/index.php?itemid=57

在这篇文章里,我将描述如何将Hibernate Search添加到JBoss Seam里面。

首先,我们需要将相关配置添加到persistence.xml中,如下:

  1. <!-- use a file system based index -->
  2. <property name="hibernate.search.default.directory_provider" value="org.hibernate.search.store.FSDirectoryProvider" />
  3. <!-- directory where the indexes will be stored -->
  4. <property name="hibernate.search.default.indexBase" value="[/path/to/your/location/directory]" />
  5. <property name="hibernate.ejb.event.post-insert" value="org.hibernate.search.event.FullTextIndexEventListener" />
  6. <property name="hibernate.ejb.event.post-update" value="org.hibernate.search.event.FullTextIndexEventListener" />
  7. <property name="hibernate.ejb.event.post-delete" value="org.hibernate.search.event.FullTextIndexEventListener" />
这样我们就设置好了类路径、索引路径、索引操作监听器路径。下面,我们需要添加hibernate-search.jar、hibernate-commons-annotations.jar和lucene-core.jar到你的ear里面。

好了,现在,我们需要告诉Hibernate Search哪个对象被索引,并且我们会对哪些属性感兴趣。
  1. @Entity
  2. @Name("product")
  3. @Indexed
  4. public class Product implements Serializable {
  5.     static final long serialVersionUID = 1l;
  6.     @Id @GeneratedValue @DocumentId
  7.     private Long id;
  8.      @NotNull
  9.     @Field(index = Index.TOKENIZED)
  10.     private String name;
  11.     @NotNull
  12.     @Field(index = Index.TOKENIZED)
  13.     private String description;
  14.     // getters and setters
  15. }

@Indexed注解用来告诉Hibernate Search该持久类是拥有索引的。@DocumentId注解用来标明这个属性是这个对象的ID,并且未被编入索引。此外,我们还有两个属性,分别是name和description。这两个属性都用@Field标注,这样Hibernate Search就被允许分析处理这两个属性。其他可选的属性有Index.NO(不要被分析)、Index.UN_TOKENIZED(不要被分析器预先处理)、Index.NO_NORM(不需要存储的普通属性)。

 

现在,我们已经拥有了Lucene的所有索引,我们还需要一个搜索的方法。所以我们需要建立一个SearchManager类。

  1. @Name("SearchManager")
  2. public class SearchManager {
  3.     @In
  4.     private FullTextEntityManager entityManager;
  5.     private String searchPattern;
  6.     // getters and setters for searchPattern
  7.     public List getResults() {
  8.          Map boostFields = new HashMap(2);
  9.          // increase the importance of the name field 
  10.          // over the other product fields
  11.          boostFields.put("name", 4f); 
  12.          String[] productFields = {"name""description"};
  13.          QueryParser parser = new MultiFieldQueryParser(productFields, new StandardAnalyzer(), boostFields);
  14.          parser.setAllowLeadingWildcard(true);
  15.        Query luceneQuery;
  16.        try {
  17.             luceneQuery = parser.parse(searchPattern);
  18.         } catch (ParseException pe) {
  19.             log.error("found a problem in search", pe);
  20.             return null;
  21.         }
  22.         // extract the products    
  23.         List products = 
  24.             entityManager.createFullTextQuery(luceneQuery, Product.class).
  25.             setMaxResults(20).getResultList();
  26.         return products;
  27.     }
  28. }
好了,现在我们可以创建search.xhtml文件,用来显示搜索结果了。下面是该文件的一个片段。
  1. <rich:dataGrid value="#{SearchManager.results}" var="garage">
  2.     [ loop over the values ]
  3. </rich:dataGrid>
然后,在pages.xml中添加一个到search.xhtml的入口。
  1. <page view-id="/search.xhtml">
  2.     <param name="searchPattern" value="#{SearchManager.searchPattern}"/>
  3. </page>
还剩下一个步骤。我们需要添加一个搜索框到菜单里面。如果你使用了Seam的默认布局,你就会看见/view/layout文件夹下面有一个menu.xhtml文件。如果没有找到,只需要将下面这一段添加到你需要的地方
  1. <h:form id="search_form">
  2.     <h:inputText id="searchPattern" required="true" value="#{SearchManager.searchPattern}" />
  3.     <h:commandButton action="/search.xhtml" value="search"></h:commandButton>
  4. </h:form>

现在,你可以开始搜索你想要的对象了。是不是非常简单?但是,如果对象的一个属性是用来表示这个对象是否能显示在页面上,那应该怎么办?好的,在这种情况下,你需要添加一个过滤器。过滤器都继承自org.apache.lucene.search.Filter类。

 

想象一下,我们在产品类上有一个属性是用来标明产品的状态的,这个属性有三种值"L"表示有效的产品,"D"表示被删除的产品,"P"表示待发布的产品。显然,在用户搜索的时候,我们只想显示出可见的产品。所以我们需要添加一个过滤器:

  1. public class LiveProductFilter extends Filter {
  2.     private static final long serialVersionUID = 1l;
  3.     public BitSet bits(IndexReader reader) throws IOException {
  4.         BitSet bitSet = new BitSet( reader.maxDoc() );
  5.         TermDocs termDocs = reader.termDocs( new Term("status""L") );
  6.         while ( termDocs.next() ) {
  7.             bitSet.set( termDocs.doc() );
  8.         }
  9.          return bitSet;
  10.         }
  11. }

为了让Hibernate Search能够找到我们在产品类上添加的过滤器,我们需要添加下面这个注解:

@FullTextFilterDefs ( { @FullTextFilterDef(name="liveProduct", impl = LiveProductFilter.class, cache=false) })好了,就写到这里。

想要了解更多信息,请参考Hibernate Search文档

深入浅出JBoss Seam

本文节选了Michael Yuan和Thomas Heute所著的即将出版JBoss Seam: Power and Flexibility Beyond Java EE 5.0第一章和第二章,内容...
  • Huakelilinjie
  • Huakelilinjie
  • 2016年03月21日 10:11
  • 1285

开源Java EE框架 JBoss Seam 详细介绍

摘要:JBoss Seam是“Java EE 5.0的一个轻量级的框架”。这是什么意思?难道Java EE(Enterprise Edition) 5.0本身不是一套“框架吗”?为什么在官方规范之外,...
  • m_hahahaha1994
  • m_hahahaha1994
  • 2016年06月25日 08:24
  • 4181

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

数据库:Oracle 9i JDBC驱动:OJDBC14 开发环境:Eclipse-JEE Spring版本:Spring 2.0.6 Hibernate版本:Hibernate Core 3.2.5...
  • l1028386804
  • l1028386804
  • 2015年09月30日 15:55
  • 1003

使用Seam Framework + JBoss 5.0 开发第一个Web应用 - 简单投票程序

Seam这个单词的本意是缝合、连接,因而,Seam的作用即是把Java EE 规范里的JSF 和 EJB技术完美融合在一起,免去了很多胶合代码,并增强了JSF 和 EJB的很多功能。Seam的设计目标...
  • tracker_w
  • tracker_w
  • 2013年08月24日 18:19
  • 1950

安装Hibernate jboss tools 去自动生成Hibernate 实体类及注解

1. 安装 Hibernate /jboss tools. hibernate tool 安装下载地址: http://www.jboss.org/tools/download  按照提示,拖...
  • memoryzxj
  • memoryzxj
  • 2015年09月25日 13:51
  • 5735

我为什么放弃Jboss和Jboss社区

1.我和jboss的结缘    直到现在还清晰的记得当初在学校和同学一起在jboss 4.0.x 上使用ejb 3.0 将一条数据存进mysql数据库里的那种喜悦之情。     我当初是在一个3、...
  • xiaobing_122613
  • xiaobing_122613
  • 2017年01月19日 09:05
  • 404

Hibernate Search常用注解总结

Hibernae Search中的@IndexedEmbedded和@ContainedIn应当是成对出现的一对注解。 @IndexedEmbedded指定在主业务实体的索引中包含关联业务实体的搜索内...
  • u011607686
  • u011607686
  • 2016年04月06日 09:23
  • 805

Hibernate + jbosstools 整合、配置、测试详解

PS:文中用的都是Eclipse配置中对应的英文提示,防止配置时找不到入口。一、前置条件 1.Eclipse 4.4.2 下载地址:Eclipse官网 http://download.eclips...
  • mimica
  • mimica
  • 2015年08月25日 16:35
  • 2330

hibernate 反向工程 插件(Jboss Tools) 的安装方法

本文环境:eclipse: eclipse-jee-neon-R-win32方法一: eclipse -> Help -> Eclipse Marketplace… 弹出如下图: 搜索 jbo...
  • jifgjifg
  • jifgjifg
  • 2016年08月18日 00:45
  • 1112

Jboss Seam 注解总结

本文转载自:http://blog.csdn.net/chenhaijing/article/details/6946705 @Name @Name("componentName") 为...
  • bestcxx
  • bestcxx
  • 2017年07月17日 15:12
  • 129
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Hibernate Search, Lucene 与 JBoss Seam
举报原因:
原因补充:

(最多只允许输入30个字)