elasticsearch group-by multiple fields

前端 未结 4 1670
孤街浪徒
孤街浪徒 2020-12-14 10:42

I am Looking for the best way to group data in elasticsearch. Elasticsearch doesn\'t support something like \'group by\' in sql.

Lets say I have 1k categories and mi

4条回答
  •  暖寄归人
    2020-12-14 11:28

    I think some developers will be definitely looking same implementation in Spring DATA ES and JAVA ES API.

    Please finds :-

    List fieldObjectList = Lists.newArrayList();
        SearchQuery aSearchQuery = new NativeSearchQueryBuilder().withQuery(matchAllQuery()).withIndices(indexName).withTypes(type)
                .addAggregation(
                        terms("ByField1").field("field1").subAggregation(AggregationBuilders.terms("ByField2").field("field2")
                                .subAggregation(AggregationBuilders.terms("ByField3").field("field3")))
                        )
                .build();
        Aggregations aField1Aggregations = elasticsearchTemplate.query(aSearchQuery, new ResultsExtractor() {
            @Override
            public Aggregations extract(SearchResponse aResponse) {
                return aResponse.getAggregations();
            }
        });
        Terms aField1Terms = aField1Aggregations.get("ByField1");
        aField1Terms.getBuckets().stream().forEach(aField1Bucket -> {
            String field1Value = aField1Bucket.getKey();
            Terms aField2Terms = aField1Bucket.getAggregations().get("ByField2");
    
            aField2Terms.getBuckets().stream().forEach(aField2Bucket -> {
                String field2Value = aField2Bucket.getKey();
                Terms aField3Terms = aField2Bucket.getAggregations().get("ByField3");
    
                aField3Terms.getBuckets().stream().forEach(aField3Bucket -> {
                    String field3Value = aField3Bucket.getKey();
                    Long count = aField3Bucket.getDocCount();
    
                    FieldObject fieldObject = new FieldObject();
                    fieldObject.setField1(field1Value);
                    fieldObject.setField2(field2Value);
                    fieldObject.setField3(field3Value);
                    fieldObject.setCount(count);
                    fieldObjectList.add(fieldObject);
                });
            });
        });
    

    imports need to be done for same :-

    import static org.elasticsearch.index.query.QueryBuilders.matchAllQuery;
    import static org.elasticsearch.search.aggregations.AggregationBuilders.terms; 
    import org.elasticsearch.action.search.SearchResponse;
    import org.elasticsearch.common.collect.Lists;
    import org.elasticsearch.index.query.FilterBuilder;
    import org.elasticsearch.index.query.FilterBuilders;
    import org.elasticsearch.index.query.TermFilterBuilder;
    import org.elasticsearch.search.aggregations.AggregationBuilders;
    import org.elasticsearch.search.aggregations.Aggregations;
    import org.elasticsearch.search.aggregations.bucket.filter.InternalFilter;
    import org.elasticsearch.search.aggregations.bucket.terms.Terms;
    import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
    import org.springframework.data.elasticsearch.core.ResultsExtractor;
    import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
    import org.springframework.data.elasticsearch.core.query.SearchQuery;
    

提交回复
热议问题