• ElasticSearch Aggs的一些使用方法


     

    这段代码是关于多层聚合和嵌套域的聚合,来源:https://github.com/elasticsearch/elasticsearch/blob/master/src/test/java/org/elasticsearch/search/aggregations/bucket/NestedTests.java

    /*
    * Licensed to Elasticsearch under one or more contributor
    * license agreements. See the NOTICE file distributed with
    * this work for additional information regarding copyright
    * ownership. Elasticsearch licenses this file to you under
    * the Apache License, Version 2.0 (the "License"); you may
    * not use this file except in compliance with the License.
    * You may obtain a copy of the License at
    *
    * http://www.apache.org/licenses/LICENSE-2.0
    *
    * Unless required by applicable law or agreed to in writing,
    * software distributed under the License is distributed on an
    * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    * KIND, either express or implied. See the License for the
    * specific language governing permissions and limitations
    * under the License.
    */
    package org.elasticsearch.search.aggregations.bucket;

    import org.elasticsearch.ElasticsearchException;
    import org.elasticsearch.action.index.IndexRequestBuilder;
    import org.elasticsearch.action.search.SearchResponse;
    import org.elasticsearch.common.xcontent.XContentBuilder;
    import org.elasticsearch.search.aggregations.Aggregator.SubAggCollectionMode;
    import org.elasticsearch.search.aggregations.bucket.histogram.Histogram;
    import org.elasticsearch.search.aggregations.bucket.nested.Nested;
    import org.elasticsearch.search.aggregations.bucket.terms.LongTerms;
    import org.elasticsearch.search.aggregations.bucket.terms.StringTerms;
    import org.elasticsearch.search.aggregations.bucket.terms.Terms;
    import org.elasticsearch.search.aggregations.bucket.terms.Terms.Bucket;
    import org.elasticsearch.search.aggregations.metrics.max.Max;
    import org.elasticsearch.search.aggregations.metrics.stats.Stats;
    import org.elasticsearch.search.aggregations.metrics.sum.Sum;
    import org.elasticsearch.test.ElasticsearchIntegrationTest;
    import org.hamcrest.Matchers;
    import org.junit.Test;

    import java.util.ArrayList;
    import java.util.List;

    import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;
    import static org.elasticsearch.index.query.QueryBuilders.matchAllQuery;
    import static org.elasticsearch.search.aggregations.AggregationBuilders.*;
    import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertAcked;
    import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertSearchResponse;
    import static org.hamcrest.Matchers.equalTo;
    import static org.hamcrest.Matchers.is;
    import static org.hamcrest.core.IsNull.notNullValue;

    /**
    *
    */
    @ElasticsearchIntegrationTest.SuiteScopeTest
    public class NestedTests extends ElasticsearchIntegrationTest {

    static int numParents;
    static int[] numChildren;
    static SubAggCollectionMode aggCollectionMode;

    @Override
    public void setupSuiteScopeCluster() throws Exception {

    assertAcked(prepareCreate("idx")
    .addMapping("type", "nested", "type=nested"));

    List<IndexRequestBuilder> builders = new ArrayList<>();

    numParents = randomIntBetween(3, 10);
    numChildren = new int[numParents];
    aggCollectionMode = randomFrom(SubAggCollectionMode.values());
    logger.info("AGG COLLECTION MODE: " + aggCollectionMode);
    int totalChildren = 0;
    for (int i = 0; i < numParents; ++i) {
    if (i == numParents - 1 && totalChildren == 0) {
    // we need at least one child overall
    numChildren[i] = randomIntBetween(1, 5);
    } else {
    numChildren[i] = randomInt(5);
    }
    totalChildren += numChildren[i];
    }
    assertTrue(totalChildren > 0);

    for (int i = 0; i < numParents; i++) {
    XContentBuilder source = jsonBuilder()
    .startObject()
    .field("value", i + 1)
    .startArray("nested");
    for (int j = 0; j < numChildren[i]; ++j) {
    source = source.startObject().field("value", i + 1 + j).endObject();
    }
    source = source.endArray().endObject();
    builders.add(client().prepareIndex("idx", "type", ""+i+1).setSource(source));
    }

    prepareCreate("empty_bucket_idx").addMapping("type", "value", "type=integer", "nested", "type=nested").execute().actionGet();
    for (int i = 0; i < 2; i++) {
    builders.add(client().prepareIndex("empty_bucket_idx", "type", ""+i).setSource(jsonBuilder()
    .startObject()
    .field("value", i*2)
    .startArray("nested")
    .startObject().field("value", i + 1).endObject()
    .startObject().field("value", i + 2).endObject()
    .startObject().field("value", i + 3).endObject()
    .startObject().field("value", i + 4).endObject()
    .startObject().field("value", i + 5).endObject()
    .endArray()
    .endObject()));
    }

    assertAcked(prepareCreate("idx_nested_nested_aggs")
    .addMapping("type", jsonBuilder().startObject().startObject("type").startObject("properties")
    .startObject("nested1")
    .field("type", "nested")
    .startObject("properties")
    .startObject("nested2")
    .field("type", "nested")
    .endObject()
    .endObject()
    .endObject()
    .endObject().endObject().endObject()));

    builders.add(
    client().prepareIndex("idx_nested_nested_aggs", "type", "1")
    .setSource(jsonBuilder().startObject()
    .startArray("nested1")
    .startObject()
    .field("a", "a")
    .startArray("nested2")
    .startObject()
    .field("b", 2)
    .endObject()
    .endArray()
    .endObject()
    .startObject()
    .field("a", "b")
    .startArray("nested2")
    .startObject()
    .field("b", 2)
    .endObject()
    .endArray()
    .endObject()
    .endArray()
    .endObject())
    );
    indexRandom(true, builders);
    ensureSearchable();
    }

    @Test
    public void simple() throws Exception {
    SearchResponse response = client().prepareSearch("idx")
    .addAggregation(nested("nested").path("nested")
    .subAggregation(stats("nested_value_stats").field("nested.value")))
    .execute().actionGet();

    assertSearchResponse(response);


    double min = Double.POSITIVE_INFINITY;
    double max = Double.NEGATIVE_INFINITY;
    long sum = 0;
    long count = 0;
    for (int i = 0; i < numParents; ++i) {
    for (int j = 0; j < numChildren[i]; ++j) {
    final long value = i + 1 + j;
    min = Math.min(min, value);
    max = Math.max(max, value);
    sum += value;
    ++count;
    }
    }

    Nested nested = response.getAggregations().get("nested");
    assertThat(nested, notNullValue());
    assertThat(nested.getName(), equalTo("nested"));
    assertThat(nested.getDocCount(), equalTo(count));
    assertThat(nested.getAggregations().asList().isEmpty(), is(false));

    Stats stats = nested.getAggregations().get("nested_value_stats");
    assertThat(stats, notNullValue());
    assertThat(stats.getMin(), equalTo(min));
    assertThat(stats.getMax(), equalTo(max));
    assertThat(stats.getCount(), equalTo(count));
    assertThat(stats.getSum(), equalTo((double) sum));
    assertThat(stats.getAvg(), equalTo((double) sum / count));
    }

    @Test
    public void onNonNestedField() throws Exception {
    try {
    client().prepareSearch("idx")
    .addAggregation(nested("nested").path("value")
    .subAggregation(stats("nested_value_stats").field("nested.value")))
    .execute().actionGet();

    fail("expected execution to fail - an attempt to nested facet on non-nested field/path");

    } catch (ElasticsearchException ese) {
    }
    }

    @Test
    public void nestedWithSubTermsAgg() throws Exception {
    SearchResponse response = client().prepareSearch("idx")
    .addAggregation(nested("nested").path("nested")
    .subAggregation(terms("values").field("nested.value").size(100)
    .collectMode(aggCollectionMode)))
    .execute().actionGet();

    assertSearchResponse(response);


    long docCount = 0;
    long[] counts = new long[numParents + 6];
    for (int i = 0; i < numParents; ++i) {
    for (int j = 0; j < numChildren[i]; ++j) {
    final int value = i + 1 + j;
    ++counts[value];
    ++docCount;
    }
    }
    int uniqueValues = 0;
    for (long count : counts) {
    if (count > 0) {
    ++uniqueValues;
    }
    }

    Nested nested = response.getAggregations().get("nested");
    assertThat(nested, notNullValue());
    assertThat(nested.getName(), equalTo("nested"));
    assertThat(nested.getDocCount(), equalTo(docCount));
    assertThat(nested.getAggregations().asList().isEmpty(), is(false));

    LongTerms values = nested.getAggregations().get("values");
    assertThat(values, notNullValue());
    assertThat(values.getName(), equalTo("values"));
    assertThat(values.getBuckets(), notNullValue());
    assertThat(values.getBuckets().size(), equalTo(uniqueValues));
    for (int i = 0; i < counts.length; ++i) {
    final String key = Long.toString(i);
    if (counts[i] == 0) {
    assertNull(values.getBucketByKey(key));
    } else {
    Bucket bucket = values.getBucketByKey(key);
    assertNotNull(bucket);
    assertEquals(counts[i], bucket.getDocCount());
    }
    }
    }

    @Test
    public void nestedAsSubAggregation() throws Exception {
    SearchResponse response = client().prepareSearch("idx")
    .addAggregation(terms("top_values").field("value").size(100)
    .collectMode(aggCollectionMode)
    .subAggregation(nested("nested").path("nested")
    .subAggregation(max("max_value").field("nested.value"))))
    .execute().actionGet();

    assertSearchResponse(response);


    LongTerms values = response.getAggregations().get("top_values");
    assertThat(values, notNullValue());
    assertThat(values.getName(), equalTo("top_values"));
    assertThat(values.getBuckets(), notNullValue());
    assertThat(values.getBuckets().size(), equalTo(numParents));

    for (int i = 0; i < numParents; i++) {
    String topValue = "" + (i + 1);
    assertThat(values.getBucketByKey(topValue), notNullValue());
    Nested nested = values.getBucketByKey(topValue).getAggregations().get("nested");
    assertThat(nested, notNullValue());
    Max max = nested.getAggregations().get("max_value");
    assertThat(max, notNullValue());
    assertThat(max.getValue(), equalTo(numChildren[i] == 0 ? Double.NEGATIVE_INFINITY : (double) i + numChildren[i]));
    }
    }

    @Test
    public void nestNestedAggs() throws Exception {
    SearchResponse response = client().prepareSearch("idx_nested_nested_aggs")
    .addAggregation(nested("level1").path("nested1")
    .subAggregation(terms("a").field("nested1.a")
    .collectMode(aggCollectionMode)
    .subAggregation(nested("level2").path("nested1.nested2")
    .subAggregation(sum("sum").field("nested1.nested2.b")))))
    .get();
    assertSearchResponse(response);


    Nested level1 = response.getAggregations().get("level1");
    assertThat(level1, notNullValue());
    assertThat(level1.getName(), equalTo("level1"));
    assertThat(level1.getDocCount(), equalTo(2l));

    StringTerms a = level1.getAggregations().get("a");
    Terms.Bucket bBucket = a.getBucketByKey("a");
    assertThat(bBucket.getDocCount(), equalTo(1l));

    Nested level2 = bBucket.getAggregations().get("level2");
    assertThat(level2.getDocCount(), equalTo(1l));
    Sum sum = level2.getAggregations().get("sum");
    assertThat(sum.getValue(), equalTo(2d));

    a = level1.getAggregations().get("a");
    bBucket = a.getBucketByKey("b");
    assertThat(bBucket.getDocCount(), equalTo(1l));

    level2 = bBucket.getAggregations().get("level2");
    assertThat(level2.getDocCount(), equalTo(1l));
    sum = level2.getAggregations().get("sum");
    assertThat(sum.getValue(), equalTo(2d));
    }


    @Test
    public void emptyAggregation() throws Exception {
    SearchResponse searchResponse = client().prepareSearch("empty_bucket_idx")
    .setQuery(matchAllQuery())
    .addAggregation(histogram("histo").field("value").interval(1l).minDocCount(0)
    .subAggregation(nested("nested").path("nested")))
    .execute().actionGet();

    assertThat(searchResponse.getHits().getTotalHits(), equalTo(2l));
    Histogram histo = searchResponse.getAggregations().get("histo");
    assertThat(histo, Matchers.notNullValue());
    Histogram.Bucket bucket = histo.getBucketByKey(1l);
    assertThat(bucket, Matchers.notNullValue());

    Nested nested = bucket.getAggregations().get("nested");
    assertThat(nested, Matchers.notNullValue());
    assertThat(nested.getName(), equalTo("nested"));
    assertThat(nested.getDocCount(), is(0l));
    }
    }

    复制代码
      1 /*
      2  * Licensed to Elasticsearch under one or more contributor
      3  * license agreements. See the NOTICE file distributed with
      4  * this work for additional information regarding copyright
      5  * ownership. Elasticsearch licenses this file to you under
      6  * the Apache License, Version 2.0 (the "License"); you may
      7  * not use this file except in compliance with the License.
      8  * You may obtain a copy of the License at
      9  *
     10  *    http://www.apache.org/licenses/LICENSE-2.0
     11  *
     12  * Unless required by applicable law or agreed to in writing,
     13  * software distributed under the License is distributed on an
     14  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
     15  * KIND, either express or implied.  See the License for the
     16  * specific language governing permissions and limitations
     17  * under the License.
     18  */
     19 package org.elasticsearch.search.aggregations.bucket;
     20 
     21 import org.elasticsearch.ElasticsearchException;
     22 import org.elasticsearch.action.index.IndexRequestBuilder;
     23 import org.elasticsearch.action.search.SearchResponse;
     24 import org.elasticsearch.common.xcontent.XContentBuilder;
     25 import org.elasticsearch.search.aggregations.Aggregator.SubAggCollectionMode;
     26 import org.elasticsearch.search.aggregations.bucket.histogram.Histogram;
     27 import org.elasticsearch.search.aggregations.bucket.nested.Nested;
     28 import org.elasticsearch.search.aggregations.bucket.terms.LongTerms;
     29 import org.elasticsearch.search.aggregations.bucket.terms.StringTerms;
     30 import org.elasticsearch.search.aggregations.bucket.terms.Terms;
     31 import org.elasticsearch.search.aggregations.bucket.terms.Terms.Bucket;
     32 import org.elasticsearch.search.aggregations.metrics.max.Max;
     33 import org.elasticsearch.search.aggregations.metrics.stats.Stats;
     34 import org.elasticsearch.search.aggregations.metrics.sum.Sum;
     35 import org.elasticsearch.test.ElasticsearchIntegrationTest;
     36 import org.hamcrest.Matchers;
     37 import org.junit.Test;
     38 
     39 import java.util.ArrayList;
     40 import java.util.List;
     41 
     42 import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;
     43 import static org.elasticsearch.index.query.QueryBuilders.matchAllQuery;
     44 import static org.elasticsearch.search.aggregations.AggregationBuilders.*;
     45 import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertAcked;
     46 import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertSearchResponse;
     47 import static org.hamcrest.Matchers.equalTo;
     48 import static org.hamcrest.Matchers.is;
     49 import static org.hamcrest.core.IsNull.notNullValue;
     50 
     51 /**
     52  *
     53  */
     54 @ElasticsearchIntegrationTest.SuiteScopeTest
     55 public class NestedTests extends ElasticsearchIntegrationTest {
     56 
     57     static int numParents;
     58     static int[] numChildren;
     59     static SubAggCollectionMode aggCollectionMode;
     60 
     61     @Override
     62     public void setupSuiteScopeCluster() throws Exception {
     63 
     64         assertAcked(prepareCreate("idx")
     65                 .addMapping("type", "nested", "type=nested"));
     66 
     67         List<IndexRequestBuilder> builders = new ArrayList<>();
     68 
     69         numParents = randomIntBetween(3, 10);
     70         numChildren = new int[numParents];
     71         aggCollectionMode = randomFrom(SubAggCollectionMode.values());
     72         logger.info("AGG COLLECTION MODE: " + aggCollectionMode);
     73         int totalChildren = 0;
     74         for (int i = 0; i < numParents; ++i) {
     75             if (i == numParents - 1 && totalChildren == 0) {
     76                 // we need at least one child overall
     77                 numChildren[i] = randomIntBetween(1, 5);
     78             } else {
     79                 numChildren[i] = randomInt(5);
     80             }
     81             totalChildren += numChildren[i];
     82         }
     83         assertTrue(totalChildren > 0);
     84 
     85         for (int i = 0; i < numParents; i++) {
     86             XContentBuilder source = jsonBuilder()
     87                     .startObject()
     88                     .field("value", i + 1)
     89                     .startArray("nested");
     90             for (int j = 0; j < numChildren[i]; ++j) {
     91                 source = source.startObject().field("value", i + 1 + j).endObject();
     92             }
     93             source = source.endArray().endObject();
     94             builders.add(client().prepareIndex("idx", "type", ""+i+1).setSource(source));
     95         }
     96 
     97         prepareCreate("empty_bucket_idx").addMapping("type", "value", "type=integer", "nested", "type=nested").execute().actionGet();
     98         for (int i = 0; i < 2; i++) {
     99             builders.add(client().prepareIndex("empty_bucket_idx", "type", ""+i).setSource(jsonBuilder()
    100                     .startObject()
    101                     .field("value", i*2)
    102                     .startArray("nested")
    103                     .startObject().field("value", i + 1).endObject()
    104                     .startObject().field("value", i + 2).endObject()
    105                     .startObject().field("value", i + 3).endObject()
    106                     .startObject().field("value", i + 4).endObject()
    107                     .startObject().field("value", i + 5).endObject()
    108                     .endArray()
    109                     .endObject()));
    110         }
    111 
    112         assertAcked(prepareCreate("idx_nested_nested_aggs")
    113                 .addMapping("type", jsonBuilder().startObject().startObject("type").startObject("properties")
    114                         .startObject("nested1")
    115                             .field("type", "nested")
    116                             .startObject("properties")
    117                                 .startObject("nested2")
    118                                     .field("type", "nested")
    119                                 .endObject()
    120                             .endObject()
    121                         .endObject()
    122                         .endObject().endObject().endObject()));
    123 
    124         builders.add(
    125                 client().prepareIndex("idx_nested_nested_aggs", "type", "1")
    126                         .setSource(jsonBuilder().startObject()
    127                                 .startArray("nested1")
    128                                     .startObject()
    129                                     .field("a", "a")
    130                                         .startArray("nested2")
    131                                             .startObject()
    132                                                 .field("b", 2)
    133                                             .endObject()
    134                                         .endArray()
    135                                     .endObject()
    136                                     .startObject()
    137                                         .field("a", "b")
    138                                         .startArray("nested2")
    139                                             .startObject()
    140                                                 .field("b", 2)
    141                                             .endObject()
    142                                         .endArray()
    143                                     .endObject()
    144                                 .endArray()
    145                             .endObject())
    146         );
    147         indexRandom(true, builders);
    148         ensureSearchable();
    149     }
    150 
    151     @Test
    152     public void simple() throws Exception {
    153         SearchResponse response = client().prepareSearch("idx")
    154                 .addAggregation(nested("nested").path("nested")
    155                         .subAggregation(stats("nested_value_stats").field("nested.value")))
    156                 .execute().actionGet();
    157 
    158         assertSearchResponse(response);
    159 
    160 
    161         double min = Double.POSITIVE_INFINITY;
    162         double max = Double.NEGATIVE_INFINITY;
    163         long sum = 0;
    164         long count = 0;
    165         for (int i = 0; i < numParents; ++i) {
    166             for (int j = 0; j < numChildren[i]; ++j) {
    167                 final long value = i + 1 + j;
    168                 min = Math.min(min, value);
    169                 max = Math.max(max, value);
    170                 sum += value;
    171                 ++count;
    172             }
    173         }
    174 
    175         Nested nested = response.getAggregations().get("nested");
    176         assertThat(nested, notNullValue());
    177         assertThat(nested.getName(), equalTo("nested"));
    178         assertThat(nested.getDocCount(), equalTo(count));
    179         assertThat(nested.getAggregations().asList().isEmpty(), is(false));
    180 
    181         Stats stats = nested.getAggregations().get("nested_value_stats");
    182         assertThat(stats, notNullValue());
    183         assertThat(stats.getMin(), equalTo(min));
    184         assertThat(stats.getMax(), equalTo(max));
    185         assertThat(stats.getCount(), equalTo(count));
    186         assertThat(stats.getSum(), equalTo((double) sum));
    187         assertThat(stats.getAvg(), equalTo((double) sum / count));
    188     }
    189 
    190     @Test
    191     public void onNonNestedField() throws Exception {
    192         try {
    193             client().prepareSearch("idx")
    194                     .addAggregation(nested("nested").path("value")
    195                             .subAggregation(stats("nested_value_stats").field("nested.value")))
    196                     .execute().actionGet();
    197 
    198             fail("expected execution to fail - an attempt to nested facet on non-nested field/path");
    199 
    200         } catch (ElasticsearchException ese) {
    201         }
    202     }
    203 
    204     @Test
    205     public void nestedWithSubTermsAgg() throws Exception {
    206         SearchResponse response = client().prepareSearch("idx")
    207                 .addAggregation(nested("nested").path("nested")
    208                         .subAggregation(terms("values").field("nested.value").size(100)
    209                                 .collectMode(aggCollectionMode)))
    210                 .execute().actionGet();
    211 
    212         assertSearchResponse(response);
    213 
    214 
    215         long docCount = 0;
    216         long[] counts = new long[numParents + 6];
    217         for (int i = 0; i < numParents; ++i) {
    218             for (int j = 0; j < numChildren[i]; ++j) {
    219                 final int value = i + 1 + j;
    220                 ++counts[value];
    221                 ++docCount;
    222             }
    223         }
    224         int uniqueValues = 0;
    225         for (long count : counts) {
    226             if (count > 0) {
    227                 ++uniqueValues;
    228             }
    229         }
    230 
    231         Nested nested = response.getAggregations().get("nested");
    232         assertThat(nested, notNullValue());
    233         assertThat(nested.getName(), equalTo("nested"));
    234         assertThat(nested.getDocCount(), equalTo(docCount));
    235         assertThat(nested.getAggregations().asList().isEmpty(), is(false));
    236 
    237         LongTerms values = nested.getAggregations().get("values");
    238         assertThat(values, notNullValue());
    239         assertThat(values.getName(), equalTo("values"));
    240         assertThat(values.getBuckets(), notNullValue());
    241         assertThat(values.getBuckets().size(), equalTo(uniqueValues));
    242         for (int i = 0; i < counts.length; ++i) {
    243             final String key = Long.toString(i);
    244             if (counts[i] == 0) {
    245                 assertNull(values.getBucketByKey(key));
    246             } else {
    247                 Bucket bucket = values.getBucketByKey(key);
    248                 assertNotNull(bucket);
    249                 assertEquals(counts[i], bucket.getDocCount());
    250             }
    251         }
    252     }
    253 
    254     @Test
    255     public void nestedAsSubAggregation() throws Exception {
    256         SearchResponse response = client().prepareSearch("idx")
    257                 .addAggregation(terms("top_values").field("value").size(100)
    258                         .collectMode(aggCollectionMode)
    259                         .subAggregation(nested("nested").path("nested")
    260                                 .subAggregation(max("max_value").field("nested.value"))))
    261                 .execute().actionGet();
    262 
    263         assertSearchResponse(response);
    264 
    265 
    266         LongTerms values = response.getAggregations().get("top_values");
    267         assertThat(values, notNullValue());
    268         assertThat(values.getName(), equalTo("top_values"));
    269         assertThat(values.getBuckets(), notNullValue());
    270         assertThat(values.getBuckets().size(), equalTo(numParents));
    271 
    272         for (int i = 0; i < numParents; i++) {
    273             String topValue = "" + (i + 1);
    274             assertThat(values.getBucketByKey(topValue), notNullValue());
    275             Nested nested = values.getBucketByKey(topValue).getAggregations().get("nested");
    276             assertThat(nested, notNullValue());
    277             Max max = nested.getAggregations().get("max_value");
    278             assertThat(max, notNullValue());
    279             assertThat(max.getValue(), equalTo(numChildren[i] == 0 ? Double.NEGATIVE_INFINITY : (double) i + numChildren[i]));
    280         }
    281     }
    282 
    283     @Test
    284     public void nestNestedAggs() throws Exception {
    285         SearchResponse response = client().prepareSearch("idx_nested_nested_aggs")
    286                 .addAggregation(nested("level1").path("nested1")
    287                         .subAggregation(terms("a").field("nested1.a")
    288                                 .collectMode(aggCollectionMode)
    289                                 .subAggregation(nested("level2").path("nested1.nested2")
    290                                         .subAggregation(sum("sum").field("nested1.nested2.b")))))
    291                 .get();
    292         assertSearchResponse(response);
    293 
    294 
    295         Nested level1 = response.getAggregations().get("level1");
    296         assertThat(level1, notNullValue());
    297         assertThat(level1.getName(), equalTo("level1"));
    298         assertThat(level1.getDocCount(), equalTo(2l));
    299 
    300         StringTerms a = level1.getAggregations().get("a");
    301         Terms.Bucket bBucket = a.getBucketByKey("a");
    302         assertThat(bBucket.getDocCount(), equalTo(1l));
    303 
    304         Nested level2 = bBucket.getAggregations().get("level2");
    305         assertThat(level2.getDocCount(), equalTo(1l));
    306         Sum sum = level2.getAggregations().get("sum");
    307         assertThat(sum.getValue(), equalTo(2d));
    308 
    309         a = level1.getAggregations().get("a");
    310         bBucket = a.getBucketByKey("b");
    311         assertThat(bBucket.getDocCount(), equalTo(1l));
    312 
    313         level2 = bBucket.getAggregations().get("level2");
    314         assertThat(level2.getDocCount(), equalTo(1l));
    315         sum = level2.getAggregations().get("sum");
    316         assertThat(sum.getValue(), equalTo(2d));
    317     }
    318 
    319 
    320     @Test
    321     public void emptyAggregation() throws Exception {
    322         SearchResponse searchResponse = client().prepareSearch("empty_bucket_idx")
    323                 .setQuery(matchAllQuery())
    324                 .addAggregation(histogram("histo").field("value").interval(1l).minDocCount(0)
    325                         .subAggregation(nested("nested").path("nested")))
    326                 .execute().actionGet();
    327 
    328         assertThat(searchResponse.getHits().getTotalHits(), equalTo(2l));
    329         Histogram histo = searchResponse.getAggregations().get("histo");
    330         assertThat(histo, Matchers.notNullValue());
    331         Histogram.Bucket bucket = histo.getBucketByKey(1l);
    332         assertThat(bucket, Matchers.notNullValue());
    333 
    334         Nested nested = bucket.getAggregations().get("nested");
    335         assertThat(nested, Matchers.notNullValue());
    336         assertThat(nested.getName(), equalTo("nested"));
    337         assertThat(nested.getDocCount(), is(0l));
    338     }
    339 }
    复制代码

    上面的代码是链接上的.下面的是自己的应用.

    public static Map<String, Object> GetRegionInfo(Client client,
    RequestSignal requestSignal, Set<String> set) {

    Map<String, Object> result = new HashMap<String, Object>();

    AggregationBuilder aggs1 = AggregationBuilders.nested("level1").path(
    "nna_regions");
    AggregationBuilder aggs2 = AggregationBuilders.filter("level2").filter(
    ConstValue.AGGS_FILTERBUILDER);
    AggregationBuilder aggs3 = AggregationBuilders.terms("level3")
    .field("nna_regions.sca_region").size(5000);
    SumBuilder aggs4 = AggregationBuilders.sum("level4").field(
    "nna_regions.dna_score");

    SearchResponse response = client
    .prepareSearch("flume-*-content-*")
    .setQuery(ConstValue.queryBuilder_statAction(requestSignal))
    .setSearchType("count")
    .addAggregation(
    aggs1.subAggregation(aggs2.subAggregation(aggs3
    .subAggregation(aggs4)))).execute().actionGet();

    Nested level1 = response.getAggregations().get("level1");
    Filter level2 = level1.getAggregations().get("level2");

    Terms level3 = level2.getAggregations().get("level3");
    Collection<Terms.Bucket> collection = level3.getBuckets();

    for (Terms.Bucket bucket : collection) {
    String region = bucket.getKey();
    long count = bucket.getDocCount();
    double score = 0;
    if (set.contains(region)) {
    Sum sum = bucket.getAggregations().get("level4");

    if (sum == null) {
    System.out.println("null");
    } else {
    score = sum.getValue();
    }
    Map<String, Object> tmp = new HashMap<String, Object>();
    tmp.put("count", count);
    tmp.put("score", score);
    result.put(region, tmp);
    }
    }
    return result;
    }

    复制代码
     1     public static Map<String, Object> GetRegionInfo(Client client,
     2             RequestSignal requestSignal, Set<String> set) {
     3 
     4         Map<String, Object> result = new HashMap<String, Object>();
     5 
     6         AggregationBuilder aggs1 = AggregationBuilders.nested("level1").path(
     7                 "nna_regions");
     8         AggregationBuilder aggs2 = AggregationBuilders.filter("level2").filter(
     9                 ConstValue.AGGS_FILTERBUILDER);
    10         AggregationBuilder aggs3 = AggregationBuilders.terms("level3")
    11                 .field("nna_regions.sca_region").size(5000);
    12         SumBuilder aggs4 = AggregationBuilders.sum("level4").field(
    13                 "nna_regions.dna_score");
    14 
    15         SearchResponse response = client
    16                 .prepareSearch("flume-*-content-*")
    17                 .setQuery(ConstValue.queryBuilder_statAction(requestSignal))
    18                 .setSearchType("count")
    19                 .addAggregation(
    20                         aggs1.subAggregation(aggs2.subAggregation(aggs3
    21                                 .subAggregation(aggs4)))).execute().actionGet();
    22 
    23         Nested level1 = response.getAggregations().get("level1");
    24         Filter level2 = level1.getAggregations().get("level2");
    25 
    26         Terms level3 = level2.getAggregations().get("level3");
    27         Collection<Terms.Bucket> collection = level3.getBuckets();
    28 
    29         for (Terms.Bucket bucket : collection) {
    30             String region = bucket.getKey();
    31             long count = bucket.getDocCount();
    32             double score = 0;
    33             if (set.contains(region)) {
    34                 Sum sum = bucket.getAggregations().get("level4");
    35 
    36                 if (sum == null) {
    37                     System.out.println("null");
    38                 } else {
    39                     score = sum.getValue();
    40                 }
    41                 Map<String, Object> tmp = new HashMap<String, Object>();
    42                 tmp.put("count", count);
    43                 tmp.put("score", score);
    44                 result.put(region, tmp);
    45             }
    46         }
    47         return result;
    48     }
    复制代码

    aggs1是取得嵌套域的名.

    其他的代码,关于取日期域值的方法.

    private String statRequest(Client esClient) {
    FilteredQueryBuilder builder = QueryBuilders.filteredQuery(
    QueryBuilders.matchAllQuery(),
    FilterBuilders.rangeFilter("tfp_save_time").from(begTime)
    .to(endTime).includeLower(true).includeUpper(true));

    AggregationBuilder aggs1 = AggregationBuilders.terms("inp_type").field(
    "inp_type");

    AggregationBuilder aggs = AggregationBuilders.dateHistogram("By_Date")
    .field("tfp_save_time").format("yyyy-MM-dd HH:mm:ss")
    .extendedBounds(begTime, endTime).interval(statType);


    SearchResponse response = esClient.prepareSearch("flume-*-content*")
    .setQuery(builder).setSearchType("count")
    .addAggregation(aggs1.subAggregation(aggs)).execute()
    .actionGet();

    Terms terms = response.getAggregations().get("inp_type");
    Collection<Terms.Bucket> inp_type = terms.getBuckets();
    Iterator<Bucket> inp_type_It = inp_type.iterator();
    // Gson gson = new GsonBuilder().disableHtmlEscaping().create();

    StatResult statResult = new StatResult(); // result.

    while (inp_type_It.hasNext()) {

    HashMap<String, Integer> test = new HashMap<String, Integer>();// result
    // nested.
    Bucket inpBucket = inp_type_It.next();
    // System.out.println(inpBucket.getKey());
    // System.out.println(inpBucket.getDocCount());
    DateHistogram dateHistogram = (DateHistogram) inpBucket
    .getAggregations().get("By_Date");
    Collection<DateHistogram.Bucket> by_date = (Collection<DateHistogram.Bucket>) dateHistogram
    .getBuckets();

    Iterator<DateHistogram.Bucket> by_date_It = by_date.iterator();

    while (by_date_It.hasNext()) {
    DateHistogram.Bucket bucket = by_date_It.next();

    int count = Integer.parseInt(String.valueOf(bucket
    .getDocCount()));
    String newdate = postDate(bucket.getKey());

    test.put(newdate, count);
    }
    if (!test.isEmpty()) {
    statResult.add(inpBucket.getKey(), test);
    }
    }
    return statResult.toString();
    }

     
  • 相关阅读:
    vue 表格组件分享
    原创-整理了下常用的js数组 、对象、数字、字符串的操作方法
    h5 plus/h5+规范使用,模块索引,教你如何去看h5+的手册
    vue 右键菜单插件 简单、可扩展、样式自定义的右键菜单
    vuecli3 引入script 针对没有cmd amd require等方式的js
    vue新手入门指导,一篇让你学会vue技术栈,本人初学时候的文档
    node搭建本地服务器
    利用nodeJs anywhere搭建本地服务器环境
    vue封装组件的正确方式-封装类似elementui的组件
    微信小程序自定义模态框(字体图标)
  • 原文地址:https://www.cnblogs.com/sha0830/p/5549305.html
Copyright © 2020-2023  润新知