初めに
Hibernate Searchを使用して、キーワードに登場する単語の回数を集計したい。※例)残酷な描写あり: 873, 異世界: 481, ハーレム: 471
Hibernate 5まではFacet専用の機能が実装されていたのだが、Hibernate 6からはAggregation機能が実装され、より一般的な集計処理となった。
実装例
集計を実施したいエンティティの変数に下記のようにアノテーションを追加する。
1 | @KeywordField (name = "keyword_facet" , aggregable = Aggregable.YES) |
集計処理
1 2 3 4 5 6 7 8 9 10 11 12 13 | @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の実装例。
1 2 3 4 | < 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