/*
* 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();
}

 

ElasticSearch Aggs的一些使用方法的更多相关文章

  1. elasticsearch+kibana+metricbeat安装部署方法

    elasticsearch+kibana+metricbeat安装部署方法 本文是elasticsearch + kibana + metricbeat,没有涉及到logstash部分.通过beat收 ...

  2. Elasticsearch java api 常用查询方法QueryBuilder构造举例

    转载:http://m.blog.csdn.net/u012546526/article/details/74184769 Elasticsearch java api 常用查询方法QueryBuil ...

  3. Elasticsearch snapshot 备份的使用方法 【备忘】

    常见的数据库都会提供备份的机制,以解决在数据库无法使用的情况下,可以开启新的实例,然后通过备份来恢复数据减少损失.虽然 Elasticsearch 有良好的容灾性,但由于以下原因,其依然需要备份机制. ...

  4. elasticsearch基本概念理解+elasticsearch 的shards unassigned处理方法 -- 最佳运维实践 - 集群规划

    1.es与MySQL的概念对比 2.概念理解 2.1 Index : 一个索引即是文档的集合 2.2 Document : 一个文档即是一个可被索引的基础单元信息,一条记录: 2.3 Replicas ...

  5. es elasticsearch 6/7 设置内存方法

    es节点的默认的heap内存大小是 1G 大小,在实际生产中,很容易导致内存溢出而导致进程被kill掉.所以我们一般会自己配置自己的,2.x的版本可以通过export ES_HEAP_SIZE=10g ...

  6. ELK之Elasticsearch

    安装并运行Elasetisearch cd elasticsearch-<version> ./bin/elasticsearch 如果你想把 Elasticsearch 作为一个守护进程 ...

  7. elasticsearch客户端连接选择

    elasticsearch支持两种协议: http协议. Native Elasticsearch binary protocol(本地elasticsearch二进制协议):elasticsearc ...

  8. 分布式搜索ElasticSearch构建集群与简单搜索实例应用

    分布式搜索ElasticSearch构建集群与简单搜索实例应用 关于ElasticSearch不介绍了,直接说应用. 分布式ElasticSearch集群构建的方法. 1.通过在程序中创建一个嵌入es ...

  9. Elasticsearch学习笔记 一

    本文版权归博客园和作者吴双本人共同所有 转载和爬虫请注明原文地址 www.cnblogs.com/tdws. 本文参考和学习资料 <ES权威指南> 一.基本概念 存储数据到ES中的行为叫做 ...

随机推荐

  1. BZOJ 1008 [HNOI2008]越狱 (简单排列组合 + 快速幂)

    1008: [HNOI2008]越狱 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 10503  Solved: 4558[Submit][Status ...

  2. UVa 11039 Building designing (贪心+排序+模拟)

    题意:给定n个非0绝对值不相同的数,让他们排成一列,符号交替但绝对值递增,求最长的序列长度. 析:我个去简单啊,也就是个水题.首先先把他们的绝对值按递增的顺序排序,然后呢,挨着扫一遍,只有符号不同才计 ...

  3. yersinia的DHCP池耗尽断网攻击

    http://jingyan.baidu.com/article/0eb457e5045bd703f1a9051d.html yersinia -G

  4. svn 创建tag

    1. 右键项目(源) 2. 选择复制到哪个路径(创建文件夹选项) 3. 选择哪个版本(源的) 4. 填写备注 5. 结束 使用:import  .合并等

  5. cuDNN

    https://developer.nvidia.com/developer-program https://developer.nvidia.com/cudnn cuda和cuDNN的关系 http ...

  6. 20155209 2016-2017-2 《Java程序设计》第八周学习总结

    20155209 2016-2017-2 <Java程序设计>第八周学习总结 教材学习内容总结 Java NIO(New IO)是一个可以替代标准Java IO API的IO API(从J ...

  7. node csv

    想实现下载csv文件的功能,内容放在mysql的blob中,在网上找的都是关于csv模块的. 由于csv的更新,网上的很多方法都用不了,比如csv(),现在已经变了:http://csv.adalta ...

  8. 【PAT Advanced Level】1015. Reversible Primes (20)

    转换进制&&逆序可以在一起进行,有一点技巧,不要用十进制数来表示低进制,容易溢出. #include <iostream> #include <vector> ...

  9. 11i AP & GL 月末对账时常用系统报表

    11i AP & GL 月末对账时常用系统报表  http://www.cnblogs.com/benio/archive/2011/10/14/2212169.html AP: 1.Invo ...

  10. MS SQL 分页存储过程

    最近换了家新公司,但是新公司没有使用分页的存储过程.那我就自个写一个往项目上套 (效率怎么样就不怎么清楚没有详细的测试过) CREATE PROCEDURE [dbo].[pro_common_pag ...