初めに
Hibernate Searchを使用して、キーワードに登場する単語の回数を集計したい。※例)残酷な描写あり: 873, 異世界: 481, ハーレム: 471
Hibernate 5まではFacet専用の機能が実装されていたのだが、Hibernate 6からはAggregation機能が実装され、より一般的な集計処理となった。
実装例
集計を実施したいエンティティの変数に下記のようにアノテーションを追加する。
@KeywordField(name = "keyword_facet", aggregable = Aggregable.YES)
集計処理
@Transactional
public Map<String, Long> aggregateByKeywords() {
AggregationKey<Map<String, Long>> countsByKeywordKey = AggregationKey.of("countsByKeyword");
return Search.session(entityManager)
.search(Novel.class) // エンティティ
.where(f -> f.matchAll()) // 全検索
.aggregation(countsByKeywordKey, f -> f.terms()
.field("keyword_facet", String.class)
.maxTermCount(10)) // 登場回数の多い順10件まで
.fetch(10)
.aggregation(countsByKeywordKey);
}
集計結果
Mapにキーワードとその文字の登場回数が設定されているので、Loop処理等で展開する。以下はVueの実装例。
<span v-for="(value, name, index) in aggregateByKeywords" :key="index">
<span v-if="index > 0">, </span>
{{ name }}: {{ value }}
</span>
R15: 1074, 残酷な描写あり: 873, 異世界: 481, ハーレム: 471, ファンタジー: 451, 異世界転移: 389, チート: 378, 魔法: 362, 冒険: 319, 主人公最強: 296