在 Hibernate Search 5.5 中对搜索结果进行排序

简介:

“秩序,秩序”- 有时不仅仅下议院尊敬的议员需要被喊着让排序,而且在特殊情况下 Hibernate 的查询结果也需要排序。

就像这样,仅仅通过一个 Sort 对象在全文本查询执行之前,对特殊的属性进行排序。

FullTextSession session = ...;
QueryParser queryParser = ...;

FullTextQuery query = session.createFullTextQuery( queryParser.parse( "summary:lucene" ), Book.class );
Sort sort = new Sort( new SortField( "title", SortField.Type.STRING, false ) );
query.setSort( sort );
List<Book> result = query.list();

就像 Lucene 5 (基于 Hibernate Search 5.5)那样,如果事先就知道排序属性,就能很好的提高性能。在这个例子中,这些可以被排序属性称之为“文本值属性”,这些文本值属性比传统的未转化的索引的方法有快速和低内存消耗的优点。

为了达到那样的目的。Hibernate Search 提供新的注解 @SortableField (它的多值组合是,@SortableFields)可以标记那些可以被排序的属性。接下来的例子展示了它是怎么样做的:

@Entity
@Indexed(index = "Book")
public class Book {

    @Id
    private Integer id;

    @Field
    @SortableField
    @DateBridge(resolution = Resolution.DAY)
    private Date publicationDate;

    @Fields({
        @Field,
        @Field(name = "sortTitle", analyze = Analyze.NO, store = Store.NO, index = Index.NO)
    })
    @SortableField(forField = "sortTitle")
    private String title;

    @Field
    private String summary;

    // constructor, getters, setters ...
}

用过了@SortableField ,接下来了解一下 @Field 注解。在这个例子中单独存在的字段对应一个属性(例如 publicationDate)仅仅使用一个特殊的 @SortableField 注解就足够让这个字段成为可排序字段。如果有多个存在的字段(如 title 属性),通过 @SortableField#forField() 可实现特殊的字段名。

注意,排序字段一定不能被分析的。在例子中为了搜索,你想给一个指定的分析属性建索引,只要为排序加上另一个未分析的字段作为 title 属性的显示。如果字段仅仅需要排序而不做其他事,你需要将它配置成非索引和非排序的,因此可避免不必要的索引被生成。

在不改变查询的情况下,对排序字段的配置。仅对需要的字段设定 Sort 就可以了:

FullTextQuery query = ...;
Sort sort = new Sort(
    new SortField( "publicationDate", SortField.Type.LONG, false ),
    new SortField( "sortTitle", SortField.Type.STRING, false )
);
query.setSort( sort );

现在如果你对一个你还没有明确声明排序的字段排序,会怎么样?例如迁移一个已完成的应用到Hibernate Search 5.5?好消息是排序将会默认使用基本功能设定排序。 Hibernate Search 检测到未设置排序字段,自然就回退到非倒排索引。

但是你要知道这样做的话性能会差很多(同样也是作为非反转内存操作的内存密集型),也许这个功能将要从 Lucene 的未来版本中完全的去除掉。因此注意在你的日志文件里的消息,像下面的这样。听从建议去声明未声明的排序字段。

WARN ManagedMultiReader:142 - HSEARCH000289: Requested sort field(s) summary_forSort are not configured for entity \
type org.hibernate.search.test.query.Book mapped to index Book, thus an uninverting reader must be created. You \
should declare the missing sort fields using @SortField.

当迁移一个存在的项目,一定要重建有效的索引,这在相关指导里有详细描述。随着所有的需要排序字段被配置,你的查询结果会被排序,就像是会议主持喊着让英国的议会会员排队那样。

文章转载自 开源中国社区[https://www.oschina.net]

相关文章
|
Java 数据库连接 数据库
|
Java 数据库连接 Apache
hibernate Search 学习研究 附件是maven工程
  Jboss 的 hibernate search 支持 hibernate 应该比较好。   所以想在项目 里面使用 hibernate search 进行 搜索。   分词使用的是 IKAnalyzer    网站是 :   http://code.google.com/p/ik-analyzer/   使用的 是 hibernate 3.6.8 + spring 
1381 0
|
Java 数据库连接 索引
hibernate Search 继续研究 增加 hibernate memcache 二级缓存 配置成功 附件maven代码(2)
首先安装 memecached 服务端:   之前写过的 文章,centos 安装memcached服务 :   http://toeo.iteye.com/blog/1240607   然后 在 前几天的 弄的  hibernate search 基础上,再添加 memcached 缓存。   因为 hibernate search 虽然 建立了索引。查询速度快了。
1672 0
|
移动开发 Java 数据库连接
Hibernate Search
Hibernate Search是在apache Lucene的基础上建立的主要用于Hibernate的持久化模型的全文检索工具。像Lucene这样的检索引擎能够给我们的项目在进行检索的时候带来非常高的效率,但是它们在基本对象的检索时会有一些问题,比如不能实现检索内容跟实体的转换,Hibernate Search正是在这样的情况下发展起来的,基于对象的检索引擎,能够很方便的将检索出来的内容转换为具体的实体对象。
994 0
|
SQL 缓存 Java
框架分析(9)-Hibernate
框架分析(9)-Hibernate
|
SQL XML 存储
Hibernate框架【五】——基本映射——多对多映射
Hibernate框架【五】——基本映射——多对多映射
485 0
|
缓存 Java 数据库连接
Hibernate:Java持久层框架的高效应用
通过上述步骤,可以在Java项目中高效应用Hibernate框架,实现对关系数据库的透明持久化管理。Hibernate提供的强大功能和灵活配置,使得开发者能够专注于业务逻辑的实现,而不必过多关注底层数据库操作。
422 1
|
SQL Java 数据库连接
Hibernate 是一款开源 ORM(对象关系映射)框架,封装了 JDBC,允许以面向对象的方式操作数据库,简化了数据访问层的开发。
Hibernate 是一款开源 ORM(对象关系映射)框架,封装了 JDBC,允许以面向对象的方式操作数据库,简化了数据访问层的开发。通过映射机制,它可以自动处理对象与数据库表之间的转换,支持主流数据库,提高了代码的可移植性和可维护性。其核心接口包括 SessionFactory、Session 和 Transaction 等,通过它们可以执行数据库的 CRUD 操作。配置方面,需在项目中引入 Hibernate 及数据库驱动依赖,并创建 `hibernate.cfg.xml` 配置文件来设置数据库连接和 Hibernate 行为参数。
477 1
|
数据库 Java 数据库连接
Struts 2 与 Hibernate 的完美邂逅:如何无缝集成两大框架,轻松玩转高效 CRUD 操作?
【8月更文挑战第31天】本文通过具体示例介绍了如何在 Struts 2 中整合 Hibernate,实现基本的 CRUD 操作。首先创建 Maven 项目并添加相关依赖,接着配置 Hibernate 并定义实体类及其映射文件。然后创建 DAO 接口及实现类处理数据库操作,再通过 Struts 2 的 Action 类处理用户请求。最后配置 `struts.xml` 文件并创建 JSP 页面展示用户列表及编辑表单。此示例展示了如何配置和使用这两个框架,使代码更加模块化和可维护。
667 0
|
SQL Java 数据库连接
Java从入门到精通:3.1.2深入学习Java EE技术——Hibernate与MyBatis等ORM框架的掌握
Java从入门到精通:3.1.2深入学习Java EE技术——Hibernate与MyBatis等ORM框架的掌握
384 1