public ScrollResult scroll(String query, TimeRange range, int limit, int offset, List<String> fields, String filter) { final Set<String> affectedIndices = determineAffectedIndices(range, filter); final Set<String> indexWildcards = indexSetRegistry.getForIndices(affectedIndices).stream() .map(IndexSet::getIndexWildcard) .collect(Collectors.toSet()); final String searchQuery; final Sorting sorting = new Sorting("_doc", Sorting.Direction.ASC); if (filter == null) { searchQuery = standardSearchRequest(query, limit, offset, range, sorting).toString(); } else { searchQuery = filteredSearchRequest(query, filter, limit, offset, range, sorting).toString(); } final Search.Builder initialSearchBuilder = new Search.Builder(searchQuery) .addType(IndexMapping.TYPE_MESSAGE) .setParameter(Parameters.SCROLL, "1m") .addIndex(indexWildcards); fields.forEach(initialSearchBuilder::addSourceIncludePattern); final io.searchbox.core.SearchResult initialResult = checkForFailedShards(JestUtils.execute(jestClient, initialSearchBuilder.build(), () -> "Unable to perform scroll search")); recordEsMetrics(initialResult, range); return scrollResultFactory.create(initialResult, query, fields); }
@SuppressWarnings("unchecked") public SearchResult search(SearchesConfig config) { final Set<IndexRange> indexRanges = determineAffectedIndicesWithRanges(config.range(), config.filter()); final SearchSourceBuilder requestBuilder = searchRequest(config); if (indexRanges.isEmpty()) { return SearchResult.empty(config.query(), requestBuilder.toString()); } final Set<String> indices = extractIndexNamesFromIndexRanges(indexRanges); final Search.Builder searchBuilder = new Search.Builder(requestBuilder.toString()) .addType(IndexMapping.TYPE_MESSAGE) .addIndex(indices); final io.searchbox.core.SearchResult searchResult = wrapInMultiSearch(searchBuilder.build(), () -> "Unable to perform search query"); final List<ResultMessage> hits = searchResult.getHits(Map.class, false).stream() .map(hit -> ResultMessage.parseFromSource(hit.id, hit.index, (Map<String, Object>) hit.source, hit.highlight)) .collect(Collectors.toList()); recordEsMetrics(searchResult, config.range()); return new SearchResult(hits, searchResult.getTotal(), indexRanges, config.query(), requestBuilder.toString(), tookMsFromSearchResult(searchResult)); }
.size(350) .sort(SortBuilders.fieldSort(FieldSortBuilder.DOC_FIELD_NAME)) .toString();
public CountResult count(String query, TimeRange range, String filter) { final Set<String> affectedIndices = determineAffectedIndices(range, filter); if (affectedIndices.isEmpty()) { return CountResult.empty(); } final String searchSource = standardSearchRequest(query, 0, -1, range, filter, null, false).toString(); final Search search = new Search.Builder(searchSource).addIndex(affectedIndices).build(); final io.searchbox.core.SearchResult searchResult = wrapInMultiSearch(search, () -> "Unable to perform count query"); recordEsMetrics(searchResult, range); return CountResult.create(searchResult.getTotal(), 0); }
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() ); }
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) ); }
return TermsHistogramResult.empty(query, searchSourceBuilder.toString(), size, interval); final Search.Builder searchBuilder = new Search.Builder(searchSourceBuilder.toString()) .ignoreUnavailable(true) .allowNoIndices(true) dateHistogramAggregation, query, searchSourceBuilder.toString(), size, tookMsFromSearchResult(searchResult),
.aggregation(builder) .size(0) .toString();
public static String getSearchRequestAsString(SearchRequest request) { String query = "POST /"; if (request.indices().length > 0) { query += StringUtils.asCsv(request.indices()) + "/"; if (request.types().length > 0) { query += StringUtils.asCsv(request.types()) + "/"; } } query += "_search"; query += getQueryParameters(request); query += "\n"; query += request.source().toString(); return query; }
@Override public String toString() { return toString(EMPTY_PARAMS); }
private long totalCount(final String[] indexNames) { // Return 0 if there are no indices in the given index set. If we run the query with an empty index list, // Elasticsearch will count all documents in all indices and thus return a wrong count. if (indexNames.length == 0) { return 0L; } final List<String> indices = Arrays.asList(indexNames); final String query = new SearchSourceBuilder() .query(QueryBuilders.matchAllQuery()) .size(0) .toString(); final Search request = new Search.Builder(query) .addIndex(indices) .build(); final MultiSearch multiSearch = new MultiSearch.Builder(request).build(); final MultiSearchResult searchResult = JestUtils.execute(jestClient, multiSearch, () -> "Fetching message count failed for indices " + indices); final List<MultiSearchResult.MultiSearchResponse> responses = searchResult.getResponses(); long total = 0L; for (MultiSearchResult.MultiSearchResponse response : responses) { if (response.isError) { throw JestUtils.specificException(() -> "Fetching message count failed for indices " + indices, response.error); } total += response.searchResult.getTotal(); } return total; } }
return FieldHistogramResult.empty(query, searchSourceBuilder.toString(), interval); final Search.Builder searchBuilder = new Search.Builder(searchSourceBuilder.toString()) .addType(IndexMapping.TYPE_MESSAGE) .addIndex(affectedIndices); histogramAggregation, query, searchSourceBuilder.toString(), interval, tookMsFromSearchResult(searchResult));
return TermsStatsResult.empty(query, searchSourceBuilder.toString()); final Search.Builder searchBuilder = new Search.Builder(searchSourceBuilder.toString()) .addType(IndexMapping.TYPE_MESSAGE) .addIndex(affectedIndices); termsAggregation, query, searchSourceBuilder.toString(), tookMsFromSearchResult(searchResult) );
@Override public String getDescription() { StringBuilder sb = new StringBuilder(); sb.append("indices["); Strings.arrayToDelimitedString(indices, ",", sb); sb.append("], "); sb.append("types["); Strings.arrayToDelimitedString(types, ",", sb); sb.append("], "); sb.append("search_type[").append(searchType).append("], "); if (source != null) { sb.append("source[").append(source.toString(FORMAT_PARAMS)).append("]"); } else { sb.append("source[]"); } return sb.toString(); } };
@Override public String toString() { StringBuilder builder = new StringBuilder(); builder.append(searchContext.indexShard().shardId()); builder.append(" "); if (searchContext.request() != null && searchContext.request().source() != null) { builder.append("source[").append(searchContext.request().source().toString()).append("], "); } else { builder.append("source[], "); } if (searchContext.getTask() != null && searchContext.getTask().getHeader(Task.X_OPAQUE_ID) != null) { builder.append("id[").append(searchContext.getTask().getHeader(Task.X_OPAQUE_ID)).append("], "); } else { builder.append("id[], "); } return builder.toString(); } }
.append(context.numberOfShards()).append("], "); if (context.request().source() != null) { sb.append("source[").append(context.request().source().toString(FORMAT_PARAMS)).append("], "); } else { sb.append("source[], ");
LOG.debug("Built Elasticsearch request; indices={}, request={}", indices, searchBuilder.toString());
public Search queryGetEventById(String uuid) { SearchSourceBuilder source = new SearchSourceBuilder(); source.query(QueryBuilders.matchQuery("uuid", uuid)); return new Search.Builder(source.toString()).addIndex(connection.getIndexName()) .addType(ElasticConstants.TYPE_EVENT).build(); }