`
yysct2005
  • 浏览: 90656 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Hibernate Search, Lucene

    博客分类:
  • java
阅读更多

首先,我们需要将相关配置添加到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的入口。

<page view-id="/search.xhtml">
    <param name="searchPattern" value="#{SearchManager.searchPattern}"/>
</page>

还剩下一个步骤。我们需要添加一个搜索框到菜单里面。如果你使用了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 Search文档

分享到:
评论

相关推荐

    Hibernate 与 Lucene 的整合框架详解

    Hibernate Search 是一个基于 Hibernate ORM 和 Apache Lucene 的开源项目,它提供了将 Hibernate 实体类自动索引到 Lucene 索引中的功能。通过这种方式,可以实现对实体数据的快速全文搜索,并且这些操作与普通的 ...

    hibernate search

    2. **Hibernate 和 Lucene**:下载并准备好相关的库文件,包括但不限于 hibernate-search.jar、lucene-core.jar、hibernate-commons-annotations.jar 等。 3. **IDE**:选择一个合适的集成开发环境 (IDE) 进行开发...

    Hibernate Search配置及简单应用

    通常,这涉及到在`pom.xml`(如果你的项目是Maven)或`build.gradle`(如果是Gradle)文件中添加Hibernate Search和Lucene库。例如: ```xml &lt;groupId&gt;org.hibernate &lt;artifactId&gt;hibernate-search-orm ...

    Hibernate Search In Action

    通过阅读这本书,读者不仅能够学会如何使用Hibernate Search进行日常的全文搜索开发,还能够深入了解Hibernate Search的设计原理以及与底层搜索引擎Lucene之间的关系。此外,本书还探讨了全文搜索的一些高级话题,...

    hibernateSearch+demo

    这个“hibernateSearch+demo”项目提供了一个实战示例,帮助开发者理解并应用 Hibernate Search 的核心概念和功能。 在 Hibernate Search 中,主要涉及以下关键知识点: 1. **全文索引**:Hibernate Search 使用 ...

    hibernate Search in action

    通过利用Lucene库的强大功能,Hibernate Search为开发者提供了在Java应用程序中执行高效、灵活的全文检索的能力。 Hibernate Search的主要目标是简化在数据库中进行复杂搜索的需求,使得开发人员可以快速地实现如...

    Getting Started with Hibernate Search

    Hibernate Search作为Hibernate Core的重要补充,为持久化领域模型提供了全文搜索查询的功能,将Lucene的搜索特性引入到Hibernate的世界中。本篇文章将深入探讨如何从零开始使用Hibernate Search,涵盖安装、配置、...

    Hibernate搜索框架HibernateSearch.zip

    等通配符号),多关键字,模糊查询,排序等6,支持Clustering7,支持直接访问Lucene API8,对Lucene索引,API的高效管理Hibernate Search运行的环境如下:1、JDK或JRE 5.0以上2、Hibernate-Search以及相应的依赖包3...

    hibernate search全文索引的创建及查询

    在Hibernate Search中,你可以使用Lucene的查询语法或者直接使用对象查询语言(OQL)进行全文搜索。以下是一个示例: ```java FullTextSession session = Search.getFullTextSession(entityManager); session....

    hibernate-search-5.5.4 api docset for Dash

    Hibernate Search 是一个强大的全文搜索引擎框架,它将Apache Lucene库集成到Hibernate ORM中,使得在Java应用程序中实现复杂的全文检索和分析功能变得简单。这个"hibernate-search-5.5.4 api docset for Dash"是...

    hibernate-search, Hibernate Search.zip

    hibernate-search, Hibernate Search Hibernate 搜索版本:5.8.0. Final - 13-09-2017描述针对Java对象的全文搜索这个项目提供 Hibernate ORM和全文索引服务( 如 Apache Lucene和 Elasticsearch

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

    3. **Hibernate Search**:作为Hibernate的一个扩展,Hibernate Search提供了基于Lucene的全文检索功能,使得在数据库中的数据可以被快速、精确地搜索。 **二、集成Hibernate Search** 1. **配置依赖**:首先,你...

    Hibernate Search in action (pdf && code)

    《Hibernate Search in Action》是一本深入探讨Hibernate Search技术的专业书籍,配合源代码一同学习,能够帮助读者更好地理解和应用这项强大的全文检索和分析框架。Hibernate Search是Hibernate ORM的一个扩展,它...

    hibernate search-3.4.0.Final-dist

    通过集成Lucene,Hibernate Search使得开发者能够在数据库中的对象模型上执行复杂的全文搜索,而无需直接与Lucene交互。这意味着开发者可以利用熟悉的Hibernate API来处理搜索操作,大大降低了学习成本。 在3.4.0....

    Hibernate Search in Action

    Hibernate Search基于Lucene构建,Lucene是当前最流行的全文搜索引擎库之一。通过与Hibernate的无缝集成,Hibernate Search为Java开发者提供了一个易于使用的接口,使得在Java应用程序中实现高性能搜索变得简单可行...

    Getting Started with Hibernate search

    Hibernate Search是Hibernate框架的一个扩展,它为持久化的领域模型提供了全文搜索查询的能力,将Lucene的搜索功能引入到Hibernate的世界。依赖于Apache Lucene——一个强大的全文搜索引擎库,同时也是Java领域事实...

Global site tag (gtag.js) - Google Analytics