ElasticSearch学習ノート:集約(Aggregation)-Top Hits

4813 ワード

本カタログ
1機能概要
2使用例
(1)シーンの例:
(2)ESクエリの例:
(3)Javaクエリの例:
3関連記事
公式ドキュメント
 
1機能概要
集約すると、各集約Bucketには、指定された順序の最初のN個のデータのみが返されます.
 
2使用例
(1)シーンの例:
ESライブラリにはメンバーデータが格納されており、各メンバーには独自の番号ID、所属チームID、個人スコアなどのデータがある:id,team_id, score, age...
チームIDリストのセットを指定:team_id IN (1, 5, 7)
各チームで最も得点が高い2人の番号IDを問い合わせる.
 
(2)ESクエリの例:
GET .../_search?routing=xxx  //                  ,         。
{
  "size": 0,  //      ,       。
  "query": {
    "bool": {
      "filter": [  //     ,           。
        {
          "terms": {
            "team_id": [
              1,
              5,
              7
            ]
          }
        }
      ]
    }
  },
  "aggs": {
    "group_aggs": {  //      :   team_id        Bucket。
      "terms": {
        "field": "team_id",
        "execution_hint": "map"  //              ,   map     。
      },
      "aggs": {
        "top_score_member": {  //      :            Bucket ,   top_hits    。
          "top_hits": {
            "size": 2,  //     2   
            "sort": [   //       score  
              {
                "score": {
                  "order": "desc"
                }
              }
            ]
          }
        }
      }
    }
  }
}

 
(3)Javaクエリの例:
TransportClientバージョンの例:
//     
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.filter(QueryBuilders.termsQuery("team_id", Lists.newArrayList(1, 3, 5)));

//     
AggregationBuilder groupAggBuilder = AggregationBuilders.terms("group_aggs")
        .field("team_id")
        .executionHint("map");  //              ,   map     。
AggregationBuilder topScoreAggBuilder = AggregationBuilders.topHits("top_score_member")
        .sort("score", SortOrder.DESC)
        .size(2);
groupAggBuilder.subAggregation(topScoreAggBuilder);

//     
SearchResponse response = transportClient.prepareSearch("index_name").setTypes("type_name")
                    .setRouting("xxx")  //                  ,         。
                    .setSize(0)
                    .setQuery(boolQueryBuilder)
                    .addAggregation(groupGoodsAggBuilder)
                    .get();

RestHighLevelClientの例:
//     
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.filter(QueryBuilders.termsQuery("team_id", Lists.newArrayList(1, 3, 5)));

//     
AggregationBuilder groupAggBuilder = AggregationBuilders.terms("group_aggs")
        .field("team_id")
        .executionHint("map");  //              ,   map     。
AggregationBuilder topScoreAggBuilder = AggregationBuilders.topHits("top_score_member")
        .sort("score", SortOrder.DESC)
        .size(2);
groupAggBuilder.subAggregation(topScoreAggBuilder);

//       
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(boolQueryBuilder);
searchSourceBuilder.size(0);
searchSourceBuilder.aggregation(groupGoodsAggBuilder);
//           ,         。
searchSourceBuilder.timeout(new TimeValue(300));
SearchRequest request = new SearchRequest("index_name")
request.source(searchSourceBuilder);
request.setRouting("xxx")  //                  ,         。

//     
SearchResponse searchResponse = restHighLevelClient.search(request, RequestOptions.DEFAULT);

SearchResponse解析の例:
if (Objects.nonNull(response) && Objects.equals(response.status(), RestStatus.OK)) {
    Terms groupResult = response.getAggregations().get("group_aggs");
    if (Objects.nonNull(groupResult)) {
        for (Terms.Bucket groupBucket : groupResult.getBuckets()) {
            TopHits topScoreResult = groupBucket.getAggregations().get("top_score_member");
            if (Objects.nonNull(topScoreResult) && topScoreResult.getHits().getHits().length > 0) {
                SearchHit searchHit = topScoreResult.getHits().getAt(0);
                MemberDTO top1Member = JSON.parseObject(searchHit.getSourceAsString(), MemberDTO.class);
                SearchHit searchHit = topScoreResult.getHits().getAt(1);
                MemberDTO top2Member = JSON.parseObject(searchHit.getSourceAsString(), MemberDTO.class);
                //     
            }
        }
    }
}

 
3関連記事
『ElasticSearch学習ノート:常用内容』
『ElasticSearch学習ノート:Multi Search』
『ElasticSearch学習ノート:Mapping』
『ElasticSearch学習ノート:Reindex』
 
公式ドキュメント
ElasticSearch Top Hits Aggregation