zoukankan      html  css  js  c++  java
  • 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();
    }

     
  • 相关阅读:
    Sys 模块
    Select,poll,epoll复用
    Urllib模块
    多线程模块
    设计模式四:观察者,模板方法,命令,状态,职责链条,解释器,中介者,访问者,策略,备忘录,迭代器
    设计模式三:适配器,桥接,组合,装饰,外观,享元,代理
    设计模式二:建造者,原型,单例
    【Unix 网络编程】TCP状态转换图详解(转)
    Mysql系列:MySql 数据库设计与基本使用
    lombok builder源码解读
  • 原文地址:https://www.cnblogs.com/sha0830/p/5549305.html
Copyright © 2011-2022 走看看