ElasticSearch Aggs的一些使用方法
这段代码是关于多层聚合和嵌套域的聚合,来源:https://github.com/elasticsearch/elasticsearch/blob/master/src/test/java/org/elasticsearch/search/aggregations/bucket/NestedTests.java
/*
* Licensed to Elasticsearch under one or more contributor
* license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright
* ownership. Elasticsearch licenses this file to you under
* the Apache License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.elasticsearch.search.aggregations.bucket;
import org.elasticsearch.ElasticsearchException;
import org.elasticsearch.action.index.IndexRequestBuilder;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.search.aggregations.Aggregator.SubAggCollectionMode;
import org.elasticsearch.search.aggregations.bucket.histogram.Histogram;
import org.elasticsearch.search.aggregations.bucket.nested.Nested;
import org.elasticsearch.search.aggregations.bucket.terms.LongTerms;
import org.elasticsearch.search.aggregations.bucket.terms.StringTerms;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.aggregations.bucket.terms.Terms.Bucket;
import org.elasticsearch.search.aggregations.metrics.max.Max;
import org.elasticsearch.search.aggregations.metrics.stats.Stats;
import org.elasticsearch.search.aggregations.metrics.sum.Sum;
import org.elasticsearch.test.ElasticsearchIntegrationTest;
import org.hamcrest.Matchers;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;
import static org.elasticsearch.index.query.QueryBuilders.matchAllQuery;
import static org.elasticsearch.search.aggregations.AggregationBuilders.*;
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertAcked;
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertSearchResponse;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.core.IsNull.notNullValue;
/**
*
*/
@ElasticsearchIntegrationTest.SuiteScopeTest
public class NestedTests extends ElasticsearchIntegrationTest {
static int numParents;
static int[] numChildren;
static SubAggCollectionMode aggCollectionMode;
@Override
public void setupSuiteScopeCluster() throws Exception {
assertAcked(prepareCreate("idx")
.addMapping("type", "nested", "type=nested"));
List<IndexRequestBuilder> builders = new ArrayList<>();
numParents = randomIntBetween(3, 10);
numChildren = new int[numParents];
aggCollectionMode = randomFrom(SubAggCollectionMode.values());
logger.info("AGG COLLECTION MODE: " + aggCollectionMode);
int totalChildren = 0;
for (int i = 0; i < numParents; ++i) {
if (i == numParents - 1 && totalChildren == 0) {
// we need at least one child overall
numChildren[i] = randomIntBetween(1, 5);
} else {
numChildren[i] = randomInt(5);
}
totalChildren += numChildren[i];
}
assertTrue(totalChildren > 0);
for (int i = 0; i < numParents; i++) {
XContentBuilder source = jsonBuilder()
.startObject()
.field("value", i + 1)
.startArray("nested");
for (int j = 0; j < numChildren[i]; ++j) {
source = source.startObject().field("value", i + 1 + j).endObject();
}
source = source.endArray().endObject();
builders.add(client().prepareIndex("idx", "type", ""+i+1).setSource(source));
}
prepareCreate("empty_bucket_idx").addMapping("type", "value", "type=integer", "nested", "type=nested").execute().actionGet();
for (int i = 0; i < 2; i++) {
builders.add(client().prepareIndex("empty_bucket_idx", "type", ""+i).setSource(jsonBuilder()
.startObject()
.field("value", i*2)
.startArray("nested")
.startObject().field("value", i + 1).endObject()
.startObject().field("value", i + 2).endObject()
.startObject().field("value", i + 3).endObject()
.startObject().field("value", i + 4).endObject()
.startObject().field("value", i + 5).endObject()
.endArray()
.endObject()));
}
assertAcked(prepareCreate("idx_nested_nested_aggs")
.addMapping("type", jsonBuilder().startObject().startObject("type").startObject("properties")
.startObject("nested1")
.field("type", "nested")
.startObject("properties")
.startObject("nested2")
.field("type", "nested")
.endObject()
.endObject()
.endObject()
.endObject().endObject().endObject()));
builders.add(
client().prepareIndex("idx_nested_nested_aggs", "type", "1")
.setSource(jsonBuilder().startObject()
.startArray("nested1")
.startObject()
.field("a", "a")
.startArray("nested2")
.startObject()
.field("b", 2)
.endObject()
.endArray()
.endObject()
.startObject()
.field("a", "b")
.startArray("nested2")
.startObject()
.field("b", 2)
.endObject()
.endArray()
.endObject()
.endArray()
.endObject())
);
indexRandom(true, builders);
ensureSearchable();
}
@Test
public void simple() throws Exception {
SearchResponse response = client().prepareSearch("idx")
.addAggregation(nested("nested").path("nested")
.subAggregation(stats("nested_value_stats").field("nested.value")))
.execute().actionGet();
assertSearchResponse(response);
double min = Double.POSITIVE_INFINITY;
double max = Double.NEGATIVE_INFINITY;
long sum = 0;
long count = 0;
for (int i = 0; i < numParents; ++i) {
for (int j = 0; j < numChildren[i]; ++j) {
final long value = i + 1 + j;
min = Math.min(min, value);
max = Math.max(max, value);
sum += value;
++count;
}
}
Nested nested = response.getAggregations().get("nested");
assertThat(nested, notNullValue());
assertThat(nested.getName(), equalTo("nested"));
assertThat(nested.getDocCount(), equalTo(count));
assertThat(nested.getAggregations().asList().isEmpty(), is(false));
Stats stats = nested.getAggregations().get("nested_value_stats");
assertThat(stats, notNullValue());
assertThat(stats.getMin(), equalTo(min));
assertThat(stats.getMax(), equalTo(max));
assertThat(stats.getCount(), equalTo(count));
assertThat(stats.getSum(), equalTo((double) sum));
assertThat(stats.getAvg(), equalTo((double) sum / count));
}
@Test
public void onNonNestedField() throws Exception {
try {
client().prepareSearch("idx")
.addAggregation(nested("nested").path("value")
.subAggregation(stats("nested_value_stats").field("nested.value")))
.execute().actionGet();
fail("expected execution to fail - an attempt to nested facet on non-nested field/path");
} catch (ElasticsearchException ese) {
}
}
@Test
public void nestedWithSubTermsAgg() throws Exception {
SearchResponse response = client().prepareSearch("idx")
.addAggregation(nested("nested").path("nested")
.subAggregation(terms("values").field("nested.value").size(100)
.collectMode(aggCollectionMode)))
.execute().actionGet();
assertSearchResponse(response);
long docCount = 0;
long[] counts = new long[numParents + 6];
for (int i = 0; i < numParents; ++i) {
for (int j = 0; j < numChildren[i]; ++j) {
final int value = i + 1 + j;
++counts[value];
++docCount;
}
}
int uniqueValues = 0;
for (long count : counts) {
if (count > 0) {
++uniqueValues;
}
}
Nested nested = response.getAggregations().get("nested");
assertThat(nested, notNullValue());
assertThat(nested.getName(), equalTo("nested"));
assertThat(nested.getDocCount(), equalTo(docCount));
assertThat(nested.getAggregations().asList().isEmpty(), is(false));
LongTerms values = nested.getAggregations().get("values");
assertThat(values, notNullValue());
assertThat(values.getName(), equalTo("values"));
assertThat(values.getBuckets(), notNullValue());
assertThat(values.getBuckets().size(), equalTo(uniqueValues));
for (int i = 0; i < counts.length; ++i) {
final String key = Long.toString(i);
if (counts[i] == 0) {
assertNull(values.getBucketByKey(key));
} else {
Bucket bucket = values.getBucketByKey(key);
assertNotNull(bucket);
assertEquals(counts[i], bucket.getDocCount());
}
}
}
@Test
public void nestedAsSubAggregation() throws Exception {
SearchResponse response = client().prepareSearch("idx")
.addAggregation(terms("top_values").field("value").size(100)
.collectMode(aggCollectionMode)
.subAggregation(nested("nested").path("nested")
.subAggregation(max("max_value").field("nested.value"))))
.execute().actionGet();
assertSearchResponse(response);
LongTerms values = response.getAggregations().get("top_values");
assertThat(values, notNullValue());
assertThat(values.getName(), equalTo("top_values"));
assertThat(values.getBuckets(), notNullValue());
assertThat(values.getBuckets().size(), equalTo(numParents));
for (int i = 0; i < numParents; i++) {
String topValue = "" + (i + 1);
assertThat(values.getBucketByKey(topValue), notNullValue());
Nested nested = values.getBucketByKey(topValue).getAggregations().get("nested");
assertThat(nested, notNullValue());
Max max = nested.getAggregations().get("max_value");
assertThat(max, notNullValue());
assertThat(max.getValue(), equalTo(numChildren[i] == 0 ? Double.NEGATIVE_INFINITY : (double) i + numChildren[i]));
}
}
@Test
public void nestNestedAggs() throws Exception {
SearchResponse response = client().prepareSearch("idx_nested_nested_aggs")
.addAggregation(nested("level1").path("nested1")
.subAggregation(terms("a").field("nested1.a")
.collectMode(aggCollectionMode)
.subAggregation(nested("level2").path("nested1.nested2")
.subAggregation(sum("sum").field("nested1.nested2.b")))))
.get();
assertSearchResponse(response);
Nested level1 = response.getAggregations().get("level1");
assertThat(level1, notNullValue());
assertThat(level1.getName(), equalTo("level1"));
assertThat(level1.getDocCount(), equalTo(2l));
StringTerms a = level1.getAggregations().get("a");
Terms.Bucket bBucket = a.getBucketByKey("a");
assertThat(bBucket.getDocCount(), equalTo(1l));
Nested level2 = bBucket.getAggregations().get("level2");
assertThat(level2.getDocCount(), equalTo(1l));
Sum sum = level2.getAggregations().get("sum");
assertThat(sum.getValue(), equalTo(2d));
a = level1.getAggregations().get("a");
bBucket = a.getBucketByKey("b");
assertThat(bBucket.getDocCount(), equalTo(1l));
level2 = bBucket.getAggregations().get("level2");
assertThat(level2.getDocCount(), equalTo(1l));
sum = level2.getAggregations().get("sum");
assertThat(sum.getValue(), equalTo(2d));
}
@Test
public void emptyAggregation() throws Exception {
SearchResponse searchResponse = client().prepareSearch("empty_bucket_idx")
.setQuery(matchAllQuery())
.addAggregation(histogram("histo").field("value").interval(1l).minDocCount(0)
.subAggregation(nested("nested").path("nested")))
.execute().actionGet();
assertThat(searchResponse.getHits().getTotalHits(), equalTo(2l));
Histogram histo = searchResponse.getAggregations().get("histo");
assertThat(histo, Matchers.notNullValue());
Histogram.Bucket bucket = histo.getBucketByKey(1l);
assertThat(bucket, Matchers.notNullValue());
Nested nested = bucket.getAggregations().get("nested");
assertThat(nested, Matchers.notNullValue());
assertThat(nested.getName(), equalTo("nested"));
assertThat(nested.getDocCount(), is(0l));
}
}

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

上面的代码是链接上的.下面的是自己的应用.
public static Map<String, Object> GetRegionInfo(Client client,
RequestSignal requestSignal, Set<String> set) {
Map<String, Object> result = new HashMap<String, Object>();
AggregationBuilder aggs1 = AggregationBuilders.nested("level1").path(
"nna_regions");
AggregationBuilder aggs2 = AggregationBuilders.filter("level2").filter(
ConstValue.AGGS_FILTERBUILDER);
AggregationBuilder aggs3 = AggregationBuilders.terms("level3")
.field("nna_regions.sca_region").size(5000);
SumBuilder aggs4 = AggregationBuilders.sum("level4").field(
"nna_regions.dna_score");
SearchResponse response = client
.prepareSearch("flume-*-content-*")
.setQuery(ConstValue.queryBuilder_statAction(requestSignal))
.setSearchType("count")
.addAggregation(
aggs1.subAggregation(aggs2.subAggregation(aggs3
.subAggregation(aggs4)))).execute().actionGet();
Nested level1 = response.getAggregations().get("level1");
Filter level2 = level1.getAggregations().get("level2");
Terms level3 = level2.getAggregations().get("level3");
Collection<Terms.Bucket> collection = level3.getBuckets();
for (Terms.Bucket bucket : collection) {
String region = bucket.getKey();
long count = bucket.getDocCount();
double score = 0;
if (set.contains(region)) {
Sum sum = bucket.getAggregations().get("level4");
if (sum == null) {
System.out.println("null");
} else {
score = sum.getValue();
}
Map<String, Object> tmp = new HashMap<String, Object>();
tmp.put("count", count);
tmp.put("score", score);
result.put(region, tmp);
}
}
return result;
}

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

aggs1是取得嵌套域的名.
其他的代码,关于取日期域值的方法.
private String statRequest(Client esClient) {
FilteredQueryBuilder builder = QueryBuilders.filteredQuery(
QueryBuilders.matchAllQuery(),
FilterBuilders.rangeFilter("tfp_save_time").from(begTime)
.to(endTime).includeLower(true).includeUpper(true));
AggregationBuilder aggs1 = AggregationBuilders.terms("inp_type").field(
"inp_type");
AggregationBuilder aggs = AggregationBuilders.dateHistogram("By_Date")
.field("tfp_save_time").format("yyyy-MM-dd HH:mm:ss")
.extendedBounds(begTime, endTime).interval(statType);
SearchResponse response = esClient.prepareSearch("flume-*-content*")
.setQuery(builder).setSearchType("count")
.addAggregation(aggs1.subAggregation(aggs)).execute()
.actionGet();
Terms terms = response.getAggregations().get("inp_type");
Collection<Terms.Bucket> inp_type = terms.getBuckets();
Iterator<Bucket> inp_type_It = inp_type.iterator();
// Gson gson = new GsonBuilder().disableHtmlEscaping().create();
StatResult statResult = new StatResult(); // result.
while (inp_type_It.hasNext()) {
HashMap<String, Integer> test = new HashMap<String, Integer>();// result
// nested.
Bucket inpBucket = inp_type_It.next();
// System.out.println(inpBucket.getKey());
// System.out.println(inpBucket.getDocCount());
DateHistogram dateHistogram = (DateHistogram) inpBucket
.getAggregations().get("By_Date");
Collection<DateHistogram.Bucket> by_date = (Collection<DateHistogram.Bucket>) dateHistogram
.getBuckets();
Iterator<DateHistogram.Bucket> by_date_It = by_date.iterator();
while (by_date_It.hasNext()) {
DateHistogram.Bucket bucket = by_date_It.next();
int count = Integer.parseInt(String.valueOf(bucket
.getDocCount()));
String newdate = postDate(bucket.getKey());
test.put(newdate, count);
}
if (!test.isEmpty()) {
statResult.add(inpBucket.getKey(), test);
}
}
return statResult.toString();
}
ElasticSearch Aggs的一些使用方法的更多相关文章
- elasticsearch+kibana+metricbeat安装部署方法
elasticsearch+kibana+metricbeat安装部署方法 本文是elasticsearch + kibana + metricbeat,没有涉及到logstash部分.通过beat收 ...
- Elasticsearch java api 常用查询方法QueryBuilder构造举例
转载:http://m.blog.csdn.net/u012546526/article/details/74184769 Elasticsearch java api 常用查询方法QueryBuil ...
- Elasticsearch snapshot 备份的使用方法 【备忘】
常见的数据库都会提供备份的机制,以解决在数据库无法使用的情况下,可以开启新的实例,然后通过备份来恢复数据减少损失.虽然 Elasticsearch 有良好的容灾性,但由于以下原因,其依然需要备份机制. ...
- elasticsearch基本概念理解+elasticsearch 的shards unassigned处理方法 -- 最佳运维实践 - 集群规划
1.es与MySQL的概念对比 2.概念理解 2.1 Index : 一个索引即是文档的集合 2.2 Document : 一个文档即是一个可被索引的基础单元信息,一条记录: 2.3 Replicas ...
- es elasticsearch 6/7 设置内存方法
es节点的默认的heap内存大小是 1G 大小,在实际生产中,很容易导致内存溢出而导致进程被kill掉.所以我们一般会自己配置自己的,2.x的版本可以通过export ES_HEAP_SIZE=10g ...
- ELK之Elasticsearch
安装并运行Elasetisearch cd elasticsearch-<version> ./bin/elasticsearch 如果你想把 Elasticsearch 作为一个守护进程 ...
- elasticsearch客户端连接选择
elasticsearch支持两种协议: http协议. Native Elasticsearch binary protocol(本地elasticsearch二进制协议):elasticsearc ...
- 分布式搜索ElasticSearch构建集群与简单搜索实例应用
分布式搜索ElasticSearch构建集群与简单搜索实例应用 关于ElasticSearch不介绍了,直接说应用. 分布式ElasticSearch集群构建的方法. 1.通过在程序中创建一个嵌入es ...
- Elasticsearch学习笔记 一
本文版权归博客园和作者吴双本人共同所有 转载和爬虫请注明原文地址 www.cnblogs.com/tdws. 本文参考和学习资料 <ES权威指南> 一.基本概念 存储数据到ES中的行为叫做 ...
随机推荐
- 8b10b
目的:保持直流平衡DC Balance). running disparity() 8bit原始数据会分成两部分,其低5位会进行5B/6B编码,高3位则进行3B/4B编码,这两种映射关系在当时已经成为 ...
- Android:手把手教你打造可缩放移动的ImageView(上)
定义ImageView,实现功能如下: 1.初始化时图片垂直居中显示,拉伸图片宽度至ImageView宽度. 2.使用两根手指放大缩小图片,可设置最大放大倍数,当图片小于ImageView宽度时,在手 ...
- linux下怎样用c语言调用shell命令
C程序调用shell脚本共同拥有三种法子 :system().popen().exec系列数call_exec1.c , system() 不用你自己去产生进程.它已经封装了,直接增加自己的命令 ex ...
- Fig723.asy
import settings; outformat="pdf"; tex="xelatex"; usepackage("amsmath") ...
- 团队项目第六周——Alpha阶段项目复审(盐酸队)
Alpha阶段项目复审 小组 优点 缺点,bug报告 名次 天冷记得穿秋裤队 功能比较新颖,可以离线下载,做的比较完整 在下载电影时容易中断 1 只会嘤嘤嘤队 游戏和记单词的融合,也比较新颖 部分浏览 ...
- Delphi Language Overview
Delphi is a high-level, compiled, strongly typed language that supports structured and object-orient ...
- UniGUI的TUniLoginForm窗口自定义背景色
uniGUI的TUniLoginForm类创建的登录窗口默认是不带颜色,可以自定义css风格来改变背景颜色. 一般是通过在UniServerModule中,在CustcomSS属性中,修改extjs的 ...
- VLC简介及使用说明
一.简介 VLC的全名是Video Lan Client,是一个开源的.跨平台的视频播放器.VLC支持大量的音视频传输.封装和编码格式,完整的功能特性列表可以在这里获得http://www.vi ...
- 如何充分利用 Windows Phone 高清屏幕
Nokia 最近发布两款6寸大屏手机:Lumia 1520 和 Lumia 1320.为了支持这种设备 WP 升级了操作系统GDR3 支持了 1080P 的高清分辨率(1520),虽然GER3 是提供 ...
- 在c#客户端程序中使用log4net
为什么使用log4net 有些日志语句只是在开发中用于调试的,不应该在Release版本中输出,log4net通过配置文件可以为Debug和Release不同的模式设置不同的输出级别来控制,而且如果已 ...