我正在嘗試對@IndexedEmbedded 進行聚合,不幸的是效果不佳,但在同一欄位上的搜索作業正常。
我有
Book {
...
@IndexedEmbedded
@ManyToOne
@JoinColumn(name="auth_id")
private Author auth;
...
}
Author {
...
@FullTextField
private String name;
...
}
Search {
...
AggregationKey<Map<String, Long>> countsByAuthKey = AggregationKey.of("countsByAuth");
SearchResult<Book> result = searchSession.search(Book.class).
where(f -> f.match().field("title").matching(title).
aggregation(countsByAuthKey, f -> f.terms().
field("auth.name", String.class)).fetchAll();
...
它在最后一行失敗,并顯示“不能在欄位 'auth.name' 上使用 'aggregation:terms'。確保該欄位被標記為可搜索/可排序/可投影/可聚合”(并且該欄位是全文欄位)
uj5u.com熱心網友回復:
如錯誤訊息中所述,您沒有將該欄位標記為可聚合。參考檔案中也提到了這一點:
關于聚合有一些限制。特別是,為了使欄位“可聚合”,必須在映射中將其標記為這樣,以便正確存盤在索引中。
事實上,在這種情況下,您不能將欄位標記為可聚合:全文欄位不能成為聚合的目標。即使 Hibernate Search 允許,這些欄位也會被標記化,因此聚合會以作者姓名的每個單詞回傳一個存盤桶(例如,一個用于“John”,一個用于“Smith”),這很可能不是您想要的。
只需在全文欄位旁邊創建另一個關鍵字欄位。使用全文欄位進行搜索,使用關鍵字欄位進行聚合。
Author {
...
@FullTextField
@KeywordField(name = "name_keyword", aggregable = Aggregable.YES)
private String name;
...
}
Search {
...
.aggregation(countsByAuthKey, f -> f.terms().
field("auth.name_keyword", String.class)).fetchAll();
...
}
在測驗之前,請記住,您需要在映射更改后重新創建索引并重新索引資料庫。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/467164.html
