/*
* 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. Caused by: Unable to load configuration. - action - file:/C:/apache-tomcat-7.0.70/webapps/Structs/WEB-INF/classes/struts.xml:7:72 at com.opensymphony.xwork2.config.ConfigurationManager.getConfigurati

    Unable to load configuration. - action - file:/C:/apache-tomcat-7.0.70/webapps/Structs/WEB-INF/class ...

  2. ubuntu 14.04查看java的安装路径

    有时候,使用apt-get install 安装了某个软件之后,却不知道这个软件的安装路径在哪里. 那怎么样去找出这个软件的安装路径呢? 下面我们java 这个软件为例, 找出ubuntu 14.04 ...

  3. Mysql工作記錄之修改默認存儲引擎及重設root用戶密碼

    1>修改默認存儲引擎方法 修改配置文件,然後重啟mysql服務: [root@CHW mysql]# cat /etc/my.cnf                            [my ...

  4. 转: JaxbContext生成xml文件或java类对象转化注解

    JAXB(Java API for XML Binding),提供了一个快速便捷的方式将Java对象与XML进行转换.在JAX-WS(Java的WebService规范之一)中,JDK1.6 自带的版 ...

  5. Metronic-最优秀的基于Bootstrap的响应式网站模版

    在所有我看到过的基于Bootstrap的网站模版中,Metronic是我认为最优秀的,其外观之友好.功能之全面让人惊叹.Metronic 是一个自适应的HTML模版,提供后台管理模版和前端内容网页模版 ...

  6. asp.net mvc 在JS中跳转到其它controller/action

    平时在ASP.NET 中经常这样写, $('#loginOut').click(function() {           $.messager.confirm('系统提示', '您确定要退出本次登 ...

  7. Nodejs-- web服务器

    第一篇关于nodejs的东西,代码在此作为备份. 该代码目前未完成,是一个阻塞式的代码. 1.index.js ar server=require('./server'); var route=req ...

  8. LeetCode137:Single Number II

    题目: Given an array of integers, every element appears three times except for one. Find that single o ...

  9. Spring Boot 2 实践记录之 Redis 及 Session Redis 配置

    先说 Redis 的配置,在一些网上资料中,Spring Boot 的 Redis 除了添加依赖外,还要使用 XML 或 Java 配置文件做些配置,不过经过实践并不需要. 先在 pom 文件中添加 ...

  10. .NET中的FileUpload控件的使用-原生JS(二)

    本篇使用原生JS进行数据传输,使用FileUpload控件上传文件,适配IE. HTML <div class="container"> <div class=& ...