/*
* 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. python小练习--函数调用函数,让对象具有能动性

    class Box:#定义一个类名为Box,类名后不必有括号,类包含类属性和类方法,这个类没有定义类属性 '''这是一个计算体积的类'''#这是这个类的__doc__属性,执行类后就可以在交互界面输入 ...

  2. IP之NCO仿真

    NCO仿真要用.vo仿真模型,不能用.v文件 /**************************************************************************** ...

  3. verilog系统函数用法

    1.$fwrite 向文件写入数据 $fdisplay 格式:$fwrite(fid,"%h%h\n",dout_r1,dout_r2); (1)fwrite是需要触发条件的,在一 ...

  4. 11.字符串{a,b}的幂集[回溯递归]

    我一直在想着这个事,早晨起来五六点,躺在床上冥想.突然悟解了,真如某些书上写的,大道不过三言两语,说破一文不值.还是按照老方法,把问题最大程度的精简,现在求集合A={a,b}的幂集,只有两个元素,应该 ...

  5. SSH:Struts + Spring + Hibernate 轻量级Java EE企业框架

    Java EE(Java Platform,Enterprise Edition)是sun公司(2009年4月20日甲骨文将其收购)推出的企业级应用程序版本.这个版本以前称为 J2EE.能够帮助我们开 ...

  6. (并查集)A Bug's Life -- POJ -- 2492

    链接: http://poj.org/problem?id=2492 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82830#probl ...

  7. Spring 配置 事务的几种方式

    Spring配置文件中关于事务配置总是由三个组成部分,DataSource.TransactionManager和代理机制这三部分,无论是那种配置方法,一般变化的只是代理机制这块! 首先我创建了两个类 ...

  8. Android-LoaderManager异步加载数据库数据

    LoaderManager异步加载数据库数据,是在(Activity/fragment/其他UI等) 加载大量的本地Database库表数据,由于数据大在加载过程中会导致UI线程阻塞,导致用户体验不好 ...

  9. ASP.Net Core 2.2 MVC入门到基本使用系列 (四)

    本教程会对基本的.Net Core 进行一个大概的且不会太深入的讲解, 在您看完本系列之后, 能基本甚至熟练的使用.Net Core进行Web开发, 感受到.Net Core的魅力. 本教程知识点大体 ...

  10. 【加密算法】MD5

    一.简介 MD5的全称是Message-Digest Algorithm 5(信息摘要算法),在90年代初由MIT Laboratory for Computer Science和RSA Data S ...