在 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 数据库连接 Apache
hibernate Search 学习研究 附件是maven工程
  Jboss 的 hibernate search 支持 hibernate 应该比较好。   所以想在项目 里面使用 hibernate search 进行 搜索。   分词使用的是 IKAnalyzer    网站是 :   http://code.google.com/p/ik-analyzer/   使用的 是 hibernate 3.6.8 + spring 
1188 0
|
Java 数据库连接 Maven
hibernate Search 继续研究 增加 hibernate memcache 二级缓存 配置成功 附件maven代码(2)
首先安装 memecached 服务端:   之前写过的 文章,centos 安装memcached服务 :   http://toeo.iteye.com/blog/1240607   然后 在 前几天的 弄的  hibernate search 基础上,再添加 memcached 缓存。   因为 hibernate search 虽然 建立了索引。查询速度快了。
1404 0
|
移动开发 Java 数据库连接
Hibernate Search
Hibernate Search是在apache Lucene的基础上建立的主要用于Hibernate的持久化模型的全文检索工具。像Lucene这样的检索引擎能够给我们的项目在进行检索的时候带来非常高的效率,但是它们在基本对象的检索时会有一些问题,比如不能实现检索内容跟实体的转换,Hibernate Search正是在这样的情况下发展起来的,基于对象的检索引擎,能够很方便的将检索出来的内容转换为具体的实体对象。
829 0
|
1月前
|
SQL 缓存 Java
框架分析(9)-Hibernate
框架分析(9)-Hibernate
|
18天前
|
SQL Java 数据库连接
Java从入门到精通:3.1.2深入学习Java EE技术——Hibernate与MyBatis等ORM框架的掌握
Java从入门到精通:3.1.2深入学习Java EE技术——Hibernate与MyBatis等ORM框架的掌握
|
27天前
|
SQL Java 关系型数据库
数据库访问:什么是Hibernate框架?
【4月更文挑战第15天】Hibernate是开源ORM框架,将Java对象与数据库表映射,简化对象-关系映射,提升开发效率和性能。它自动化处理数据操作,支持多种数据库,自动生成SQL,提供配置选项和高级特性,减少手动SQL编写,便于切换数据库。
26 2
|
10月前
|
SQL XML 存储
Hibernate框架【五】——基本映射——多对多映射
Hibernate框架【五】——基本映射——多对多映射
130 0
|
8月前
|
Java 数据库连接
简述使用Hibernate框架的几个步骤
简述使用Hibernate框架的几个步骤
41 0
|
9月前
|
SQL Java 关系型数据库
Hibernate框架概述
Hibernate框架概述
81 0
|
10月前
|
SQL 缓存 Oracle
Hibernate框架【一】——HIbernate框架介绍
Hibernate框架【一】——HIbernate框架介绍
177 0