public TermsResult terms(String field, List<String> stackedFields, int size, String query, String filter, TimeRange range, Sorting.Direction sorting) { final Terms.Order termsOrder = sorting == Sorting.Direction.DESC ? Terms.Order.count(false) : Terms.Order.count(true); final SearchSourceBuilder searchSourceBuilder = filteredSearchRequest(query, filter, range); searchSourceBuilder.aggregation(createTermsBuilder(field, stackedFields, size, termsOrder)); searchSourceBuilder.aggregation(AggregationBuilders.missing("missing") .field(field)); final Set<String> affectedIndices = determineAffectedIndices(range, filter); if (affectedIndices.isEmpty()) { return TermsResult.empty(query, searchSourceBuilder.toString()); } final Search.Builder searchBuilder = new Search.Builder(searchSourceBuilder.toString()) .ignoreUnavailable(true) .allowNoIndices(true) .addType(IndexMapping.TYPE_MESSAGE) .addIndex(affectedIndices); final io.searchbox.core.SearchResult searchResult = wrapInMultiSearch(searchBuilder.build(), () -> "Unable to perform terms query"); recordEsMetrics(searchResult, range); final TermsAggregation termsAggregation = searchResult.getAggregations().getFilterAggregation(AGG_FILTER).getTermsAggregation(AGG_TERMS); final MissingAggregation missing = searchResult.getAggregations().getMissingAggregation("missing"); return new TermsResult( termsAggregation, missing.getMissing(), searchResult.getTotal(), query, searchSourceBuilder.toString(), tookMsFromSearchResult(searchResult), // Concat field and stacked fields into one fields list ImmutableList.<String>builder().add(field).addAll(stackedFields).build() ); }
final FilterAggregation f = result.getAggregations().getFilterAggregation("agg"); if (f == null) { throw new IndexNotFoundException("Couldn't build index range of index " + index + " because it doesn't exist.");
final ExtendedStatsAggregation extendedStatsAggregation = searchResponse.getAggregations().getExtendedStatsAggregation(AGG_EXTENDED_STATS); final ValueCountAggregation valueCountAggregation = searchResponse.getAggregations().getValueCountAggregation(AGG_VALUE_COUNT); final CardinalityAggregation cardinalityAggregation = searchResponse.getAggregations().getCardinalityAggregation(AGG_CARDINALITY);
final DateHistogramAggregation dateHistogramAggregation = searchResult.getAggregations().getDateHistogramAggregation(AGG_HISTOGRAM);
public HistogramResult histogram(String query, DateHistogramInterval interval, String filter, TimeRange range) { final DateHistogramAggregationBuilder histogramBuilder = AggregationBuilders.dateHistogram(AGG_HISTOGRAM) .field(Message.FIELD_TIMESTAMP) .dateHistogramInterval(interval.toESInterval()); final SearchSourceBuilder searchSourceBuilder = filteredSearchRequest(query, filter, range) .aggregation(histogramBuilder); final Set<String> affectedIndices = determineAffectedIndices(range, filter); if (affectedIndices.isEmpty()) { return DateHistogramResult.empty(query, searchSourceBuilder.toString(), interval); } final Search.Builder searchBuilder = new Search.Builder(searchSourceBuilder.toString()) .addType(IndexMapping.TYPE_MESSAGE) .addIndex(affectedIndices) .ignoreUnavailable(true) .allowNoIndices(true); final io.searchbox.core.SearchResult searchResult = wrapInMultiSearch(searchBuilder.build(), () -> "Unable to retrieve histogram"); recordEsMetrics(searchResult, range); final HistogramAggregation histogramAggregation = searchResult.getAggregations().getHistogramAggregation(AGG_HISTOGRAM); return new DateHistogramResult( histogramAggregation, query, searchSourceBuilder.toString(), interval, tookMsFromSearchResult(searchResult) ); }
final HistogramAggregation histogramAggregation = searchResult.getAggregations().getHistogramAggregation(AGG_HISTOGRAM);
final FilterAggregation filterAggregation = searchResult.getAggregations().getFilterAggregation(AGG_FILTER); final TermsAggregation termsAggregation = filterAggregation.getTermsAggregation(AGG_TERMS_STATS);
/** * get tag index search response dto * * @param searchResult elastic search result * * @return list of tag type index search response dto */ public List<TagTypeIndexSearchResponseDto> getTagTagIndexSearchResponseDto(SearchResult searchResult) { MetricAggregation metricAggregation = searchResult.getAggregations(); TermsAggregation tagTypeFacetAggregation = metricAggregation.getTermsAggregation(TAG_TYPE_FACET_AGGS); return getTagTypeIndexSearchResponseDtosFromTermsAggregation(tagTypeFacetAggregation); }
/** * get tag index search response dto * * @param searchResult elastic search result * * @return list of tag type index search response dto */ public List<TagTypeIndexSearchResponseDto> getTagTagIndexSearchResponseDto(SearchResult searchResult) { MetricAggregation metricAggregation = searchResult.getAggregations(); TermsAggregation tagTypeFacetAggregation = metricAggregation.getTermsAggregation(TAG_TYPE_FACET_AGGS); return getTagTypeIndexSearchResponseDtosFromTermsAggregation(tagTypeFacetAggregation); }
private CompletableFuture<List<String>> getTopN(int N, String groupByTerm, String keyForMissingTerm, List<Filter> filters) { if (N < 1) { // Avoid a query and return an empty list return CompletableFuture.completedFuture(Collections.emptyList()); } // Increase the multiplier for increased accuracy // See https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-terms-aggregation.html#_size final int multiplier = 2; final String query = searchQueryProvider.getTopNQuery(multiplier*N, groupByTerm, keyForMissingTerm, filters); return searchAsync(query, extractTimeRangeFilter(filters)) .thenApply(res -> { final MetricAggregation aggs = res.getAggregations(); if (aggs == null) { // No results return Collections.emptyList(); } final TermsAggregation groupedBy = aggs.getTermsAggregation("grouped_by"); if (groupedBy == null) { // No results return Collections.emptyList(); } return groupedBy.getBuckets().stream() .map(TermsAggregation.Entry::getKey) .limit(N) .collect(Collectors.toList()); }); }
public <T> AggregatedPage<T> mapResults(SearchResult response, Class<T> clazz, List<AbstractAggregationBuilder> aggregations, Pageable pageable) { LinkedList<T> results = new LinkedList<>(); for (SearchResult.Hit<JsonObject, Void> hit : response.getHits(JsonObject.class)) { if (hit != null) { results.add(mapSource(hit.source, clazz)); } } String scrollId = null; if (response instanceof ExtendedSearchResult) { scrollId = ((ExtendedSearchResult) response).getScrollId(); } return new AggregatedPageImpl<>(results, pageable, response.getTotal(), response.getAggregations(), scrollId); }
/** * create tag tag index response dto * * @param searchResult search result * * @return tag type index search response dto list */ public List<TagTypeIndexSearchResponseDto> getNestedTagTagIndexSearchResponseDto(SearchResult searchResult) { MetricAggregation metricAggregation = searchResult.getAggregations(); MetricAggregation tagFacetAggregation = metricAggregation.getSumAggregation(TAG_FACET_AGGS); TermsAggregation tagTypeCodesAggregation = tagFacetAggregation.getTermsAggregation(TAGTYPE_CODE_AGGREGATION); return getTagTypeIndexSearchResponseDtosFromTermsAggregation(tagTypeCodesAggregation); }
/** * create tag tag index response dto * * @param searchResult search result * * @return tag type index search response dto list */ public List<TagTypeIndexSearchResponseDto> getNestedTagTagIndexSearchResponseDto(SearchResult searchResult) { MetricAggregation metricAggregation = searchResult.getAggregations(); MetricAggregation tagFacetAggregation = metricAggregation.getSumAggregation(TAG_FACET_AGGS); TermsAggregation tagTypeCodesAggregation = tagFacetAggregation.getTermsAggregation(TAGTYPE_CODE_AGGREGATION); return getTagTypeIndexSearchResponseDtosFromTermsAggregation(tagTypeCodesAggregation); }
@Test public void testGetNestedTagTagIndexSearchResponseDtoSearchResultParameter() { SearchResult searchResult = mock(SearchResult.class); MetricAggregation metricAggregation = mock(MetricAggregation.class); SumAggregation tagFacetAggregation = mock(SumAggregation.class); TermsAggregation tagTypeCodesAggregation = mock(TermsAggregation.class); when(searchResult.getAggregations()).thenReturn(metricAggregation); when(metricAggregation.getSumAggregation(TAG_FACET_AGGS)).thenReturn(tagFacetAggregation); when(tagFacetAggregation.getTermsAggregation(TAGTYPE_CODE_AGGREGATION)).thenReturn(tagTypeCodesAggregation); List<TagTypeIndexSearchResponseDto> result = elasticsearchHelper.getNestedTagTagIndexSearchResponseDto(searchResult); assertThat("Result is null.", result, is(notNullValue())); }
@Test public void testGetResultTypeIndexSearchResponseDtoSearchResult() { SearchResult searchResult = mock(SearchResult.class); MetricAggregation metricAggregation = mock(MetricAggregation.class); TermsAggregation termsAggregation = mock(TermsAggregation.class); List<TermsAggregation.Entry> buckets = new ArrayList<>(); buckets.add(new TermsAggregation("TermAggregation", new JsonObject()).new Entry(new JsonObject(), "key", 1L)); when(searchResult.getAggregations()).thenReturn(metricAggregation); when(metricAggregation.getTermsAggregation(RESULT_TYPE_AGGS)).thenReturn(termsAggregation); when(termsAggregation.getBuckets()).thenReturn(buckets); List<ResultTypeIndexSearchResponseDto> result = elasticsearchHelper.getResultTypeIndexSearchResponseDto(searchResult); assertThat("Result is null.", result, is(notNullValue())); }
/** * Creates result type facet response dto * * @param searchResult search result * * @return result type facet response dto list */ public List<ResultTypeIndexSearchResponseDto> getResultTypeIndexSearchResponseDto(SearchResult searchResult) { MetricAggregation metricAggregation = searchResult.getAggregations(); TermsAggregation resultTypeAggregation = metricAggregation.getTermsAggregation(RESULT_TYPE_AGGS); List<TermsAggregation.Entry> buckets = resultTypeAggregation.getBuckets(); List<ResultTypeIndexSearchResponseDto> resultTypeIndexSearchResponseDtos = new ArrayList<>(); for (TermsAggregation.Entry entry : buckets) { ResultTypeIndexSearchResponseDto dto = new ResultTypeIndexSearchResponseDto(); dto.setResultTypeCode(entry.getKeyAsString()); dto.setResultTypeDisplayName(entry.getKeyAsString()); dto.setCount(entry.getCount()); resultTypeIndexSearchResponseDtos.add(dto); } return resultTypeIndexSearchResponseDtos; }
@Override @SuppressWarnings("nls") public void listOrgs(IAsyncResultHandler<List<String>> handler) { try { String query = "{\n" + " \"aggs\" : {\n" + " \"all_orgs\" : {\n" + " \"terms\" : { \"field\" : \"organizationId\" }\n" + // i.e. only records containing an orgId field. " }\n" + " }\n" + "}"; Search search = new Search.Builder(query) .addIndex(getIndexName()) .setParameter(Parameters.SIZE, 0) .build(); SearchResult response = getClient().execute(search); // Aggregations section MetricAggregation aggregation = response.getAggregations(); // Look at the terms subsection TermsAggregation terms = aggregation.getTermsAggregation("all_orgs"); // Grab only the name of each aggregation (we don't care about count List<String> results = terms.getBuckets().stream() .map(TermsAggregation.Entry::getKey) .collect(Collectors.toList()); handler.handle(AsyncResultImpl.create(results)); } catch (IOException e) { handler.handle(AsyncResultImpl.create(e)); } }
/** * Creates result type facet response dto * * @param searchResult search result * * @return result type facet response dto list */ public List<ResultTypeIndexSearchResponseDto> getResultTypeIndexSearchResponseDto(SearchResult searchResult) { MetricAggregation metricAggregation = searchResult.getAggregations(); TermsAggregation resultTypeAggregation = metricAggregation.getTermsAggregation(RESULT_TYPE_AGGS); List<TermsAggregation.Entry> buckets = resultTypeAggregation.getBuckets(); List<ResultTypeIndexSearchResponseDto> resultTypeIndexSearchResponseDtos = new ArrayList<>(); for (TermsAggregation.Entry entry : buckets) { ResultTypeIndexSearchResponseDto dto = new ResultTypeIndexSearchResponseDto(); dto.setResultTypeCode(entry.getKeyAsString()); dto.setResultTypeDisplayName(entry.getKeyAsString()); dto.setCount(entry.getCount()); resultTypeIndexSearchResponseDtos.add(dto); } return resultTypeIndexSearchResponseDtos; }
private static void toTable(ImmutableTable.Builder<Directional<String>, Long, Double> builder, SearchResult res) { final MetricAggregation aggs = res.getAggregations(); if (aggs == null) { // No results return; } final TermsAggregation groupedBy = aggs.getTermsAggregation("grouped_by"); if (groupedBy == null) { // No results return; } for (TermsAggregation.Entry bucket : groupedBy.getBuckets()) { final TermsAggregation directionAgg = bucket.getTermsAggregation("direction"); for (TermsAggregation.Entry directionBucket : directionAgg.getBuckets()) { final boolean isIngress = isIngress(directionBucket); final ProportionalSumAggregation sumAgg = directionBucket.getAggregation("bytes", ProportionalSumAggregation.class); for (ProportionalSumAggregation.DateHistogram dateHistogram : sumAgg.getBuckets()) { builder.put(new Directional<>(bucket.getKey(), isIngress), dateHistogram.getTime(), dateHistogram.getValue()); } } } }
private static void toTable(ImmutableTable.Builder<Directional<String>, Long, Double> builder, SearchResult res) { final MetricAggregation aggs = res.getAggregations(); if (aggs == null) { // No results return; } final TermsAggregation groupedBy = aggs.getTermsAggregation("grouped_by"); if (groupedBy == null) { // No results return; } for (TermsAggregation.Entry bucket : groupedBy.getBuckets()) { final TermsAggregation directionAgg = bucket.getTermsAggregation("direction"); for (TermsAggregation.Entry directionBucket : directionAgg.getBuckets()) { final boolean isIngress = isIngress(directionBucket); final ProportionalSumAggregation sumAgg = directionBucket.getAggregation("bytes", ProportionalSumAggregation.class); for (ProportionalSumAggregation.DateHistogram dateHistogram : sumAgg.getBuckets()) { builder.put(new Directional<>(bucket.getKey(), isIngress), dateHistogram.getTime(), dateHistogram.getValue()); } } } }