歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> 在 Hibernate Search 5.5 中對搜索結果進行排序

在 Hibernate Search 5.5 中對搜索結果進行排序

日期:2017/2/28 13:57:32   编辑:Linux教程

“秩序,秩序”- 有時不僅僅下議院尊敬的議員需要被喊著讓排序,而且在特殊情況下 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.

當遷移一個存在的項目,一定要重建有效的索引,這在相關指導裡有詳細描述。隨著所有的需要排序字段被配置,你的查詢結果會被排序,就像是會議主持喊著讓英國的議會會員排隊那樣。

Hibernate Search 的詳細介紹:請點這裡
Hibernate Search 的下載地址:請點這裡

英文原文:Order, ooorder! Sorting results in Hibernate Search 5.5

Copyright © Linux教程網 All Rights Reserved