原文地址:http://www.abstractec.co.uk/blog/index.php?itemid=57
在这篇文章里,我将描述如何将Hibernate Search添加到JBoss Seam里面。
首先,我们需要将相关配置添加到persistence.xml中,如下:
<!-- use a file system based index -->
<property name="hibernate.search.default.directory_provider" value="org.hibernate.search.store.FSDirectoryProvider" />
<!-- directory where the indexes will be stored -->
<property name="hibernate.search.default.indexBase" value="[/path/to/your/location/directory]" />
<property name="hibernate.ejb.event.post-insert" value="org.hibernate.search.event.FullTextIndexEventListener" />
<property name="hibernate.ejb.event.post-update" value="org.hibernate.search.event.FullTextIndexEventListener" />
<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哪个对象被索引,并且我们会对哪些属性感兴趣。
@Entity
@Name("product")
@Indexed
public class Product implements Serializable {
static final long serialVersionUID = 1l;
@Id @GeneratedValue @DocumentId
private Long id;
@NotNull
@Field(index = Index.TOKENIZED)
private String name;
@NotNull
@Field(index = Index.TOKENIZED)
private String description;
// getters and setters
}
@Indexed注解用来告诉Hibernate Search该持久类是拥有索引的。@DocumentId注解用来标明这个属性是这个对象的ID,并且未被编入索引。此外,我们还有两个属性,分别是name和description。这两个属性都用@Field标注,这样Hibernate Search就被允许分析处理这两个属性。其他可选的属性有Index.NO(不要被分析)、Index.UN_TOKENIZED(不要被分析器预先处理)、Index.NO_NORM(不需要存储的普通属性)。
现在,我们已经拥有了Lucene的所有索引,我们还需要一个搜索的方法。所以我们需要建立一个SearchManager类。
@Name("SearchManager")
public class SearchManager {
@In
private FullTextEntityManager entityManager;
private String searchPattern;
// getters and setters for searchPattern
public List getResults() {
Map boostFields = new HashMap(2);
// increase the importance of the name field
// over the other product fields
boostFields.put("name", 4f);
String[] productFields = {"name", "description"};
QueryParser parser = new MultiFieldQueryParser(productFields, new StandardAnalyzer(), boostFields);
parser.setAllowLeadingWildcard(true);
Query luceneQuery;
try {
luceneQuery = parser.parse(searchPattern);
} catch (ParseException pe) {
log.error("found a problem in search", pe);
return null;
}
// extract the products
List products =
entityManager.createFullTextQuery(luceneQuery, Product.class).
setMaxResults(20).getResultList();
return products;
}
}
好了,现在我们可以创建search.xhtml文件,用来显示搜索结果了。下面是该文件的一个片段。
<rich:dataGrid value="#{SearchManager.results}" var="garage">
[ loop over the values ]
</rich:dataGrid>
然后,在pages.xml中添加一个到search.xhtml的入口。
还剩下一个步骤。我们需要添加一个搜索框到菜单里面。如果你使用了Seam的默认布局,你就会看见/view/layout文件夹下面有一个menu.xhtml文件。如果没有找到,只需要将下面这一段添加到你需要的地方:
<h:form id="search_form">
<h:inputText id="searchPattern" required="true" value="#{SearchManager.searchPattern}" />
<h:commandButton action="/search.xhtml" value="search"></h:commandButton>
</h:form>
现在,你可以开始搜索你想要的对象了。是不是非常简单?但是,如果对象的一个属性是用来表示这个对象是否能显示在页面上,那应该怎么办?好的,在这种情况下,你需要添加一个过滤器。过滤器都继承自org.apache.lucene.search.Filter类。
想象一下,我们在产品类上有一个属性是用来标明产品的状态的,这个属性有三种值"L"表示有效的产品,"D"表示被删除的产品,"P"表示待发布的产品。显然,在用户搜索的时候,我们只想显示出可见的产品。所以我们需要添加一个过滤器:
public class LiveProductFilter extends Filter {
private static final long serialVersionUID = 1l;
public BitSet bits(IndexReader reader) throws IOException {
BitSet bitSet = new BitSet( reader.maxDoc() );
TermDocs termDocs = reader.termDocs( new Term("status", "L") );
while ( termDocs.next() ) {
bitSet.set( termDocs.doc() );
}
return bitSet;
}
}
为了让Hibernate Search能够找到我们在产品类上添加的过滤器,我们需要添加下面这个注解:
@FullTextFilterDefs ( { @FullTextFilterDef(name="liveProduct", impl = LiveProductFilter.class, cache=false) })
好了,就写到这里。
分享到:
相关推荐
### Hibernate 与 Lucene 的整合框架详解 #### 一、概述 在软件开发领域,特别是企业级应用开发中,高效的数据检索与管理是至关重要的。Hibernate 和 Lucene 分别作为对象关系映射(ORM)工具和全文搜索引擎,在...
Seam为持久化集成了JPA和Hibernate 3,为轻量化的异步性集成了EJB Timer Service和Quartz,为工作流集成了jBPM,为业务规则集成了JBoss规则,为电子邮件集成了Meldware Mail,为完整的文本搜索集成了Hibernate ...
通过阅读这本书,读者不仅能够学会如何使用Hibernate Search进行日常的全文搜索开发,还能够深入了解Hibernate Search的设计原理以及与底层搜索引擎Lucene之间的关系。此外,本书还探讨了全文搜索的一些高级话题,...
Hibernate Search 是一款强大的搜索工具,它为基于 Hibernate 的应用程序提供了一种将实体类与 Lucene 索引映射的方法,使得开发人员能够轻松地在应用程序中实现全文搜索功能。本文主要介绍如何搭建 Hibernate ...
通常,这涉及到在`pom.xml`(如果你的项目是Maven)或`build.gradle`(如果是Gradle)文件中添加Hibernate Search和Lucene库。例如: ```xml <groupId>org.hibernate <artifactId>hibernate-search-orm ...
2. **领域对象映射**:如同 Hibernate ORM 将数据库表映射为 Java 对象,Hibernate Search 将这些对象映射到 Lucene 索引。你可以通过注解或者配置文件来定义哪些字段应该被索引以及如何索引。 3. **索引策略**:...
通过利用Lucene库的强大功能,Hibernate Search为开发者提供了在Java应用程序中执行高效、灵活的全文检索的能力。 Hibernate Search的主要目标是简化在数据库中进行复杂搜索的需求,使得开发人员可以快速地实现如...
确保你使用的Lucene版本与Hibernate Search相匹配,正确版本可在Hibernate Search分发包中的`lib/readme.txt`找到。 安装过程需添加三个核心JAR包至项目: - `hibernate-search.jar`:Hibernate Search的核心API和...
等通配符号),多关键字,模糊查询,排序等6,支持Clustering7,支持直接访问Lucene API8,对Lucene索引,API的高效管理Hibernate Search运行的环境如下:1、JDK或JRE 5.0以上2、Hibernate-Search以及相应的依赖包3...
Hibernate Search通过将Lucene与Hibernate ORM结合,使得开发者可以方便地在数据库存储的数据上执行全文搜索。 3. **全文检索**:Hibernate Search支持对数据库中的文本字段进行全文检索,包括模糊匹配、近似搜索、...
在Hibernate Search中,你可以使用Lucene的查询语法或者直接使用对象查询语言(OQL)进行全文搜索。以下是一个示例: ```java FullTextSession session = Search.getFullTextSession(entityManager); session....
确保你使用的Lucene版本与Hibernate Search所基于的版本相同,正确的版本可以在Hibernate Search发行版中的lib/readme.txt找到。 安装Hibernate Search需要以下三个JAR文件: - hibernate-search.jar:Hibernate ...
Solr、Elasticsearch和Lucene是三个在搜索引擎领域中至关重要的技术,它们共同构建了现代数据检索的基础架构。下面将分别对这三个组件进行详细解释,并探讨它们之间的关系。 **Lucene** Lucene是一个高性能、全文本...
本书首先会介绍Hibernate Search的基本概念,包括什么是全文搜索引擎、如何与Hibernate ORM集成以及其工作原理。接着,会详细讲解如何配置和初始化Hibernate Search,包括设置索引存储、分析器选择和分词策略等关键...
**一、Spring与Hibernate Search简介** 1. **Spring框架**:Spring是一个开源的Java企业级应用框架,提供依赖注入、AOP(面向切面编程)、MVC(模型-视图-控制器)等核心特性,极大地简化了Java应用的开发过程。 2...
hibernate-search, Hibernate Search Hibernate 搜索版本:5.8.0. Final - 13-09-2017描述针对Java对象的全文搜索这个项目提供 Hibernate ORM和全文索引服务( 如 Apache Lucene和 Elasticsearch
在实际应用中,`hibernate-search-3.4.0.Final`可能与Hibernate ORM、JPA以及应用服务器如Tomcat或JBoss一起部署。源码中的`jbossmodules`模块展示了如何在这些环境中配置和启动Hibernate Search。 **9. 学习路径**...