@AssistedInject public ScrollResult(JestClient jestClient, ObjectMapper objectMapper, @Assisted SearchResult initialResult, @Assisted("query") String query, @Assisted("scroll") String scroll, @Assisted List<String> fields) { super(query, null, initialResult.getJsonObject().path("took").asLong()); this.jestClient = jestClient; this.objectMapper = objectMapper; this.initialResult = initialResult; this.scroll = scroll; this.fields = fields; totalHits = initialResult.getTotal(); scrollId = getScrollIdFromResult(initialResult); final Md5Hash md5Hash = new Md5Hash(getOriginalQuery()); queryHash = md5Hash.toHex(); LOG.debug("[{}] Starting scroll request for query {}", queryHash, getOriginalQuery()); }
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); }
@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)); }
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; } }
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() ); }
private void runSearch() { SearchResult searchResult = searcher.runSearch(); JsonArray hits = searchResult.getJsonObject().get( "hits" ).getAsJsonObject().get( "hits" ).getAsJsonArray(); results = new ArrayList<>( searchResult.getTotal() ); for ( JsonElement hit : hits ) { EntityInfo converted = searcher.convertQueryHit( hit.getAsJsonObject() ); if ( converted != null ) { results.add( converted ); } } } }
private void fillChildren(List<MutableMetrics> childMetrics, SearchResult result) { if (childMetrics.size() > 0) { MutableMetrics child = childMetrics.get(0); child.setCount(TraversalMetrics.ELEMENT_COUNT_ID, result.getTotal()); child.setDuration(Long.parseLong(result.getJsonObject().get("took").toString()), TimeUnit.MILLISECONDS); } }
@Override public List<EntityInfo> queryEntityInfos() { if ( searchResult == null ) { execute(); } List<EntityInfo> results = new ArrayList<>( searchResult.getTotal() ); JsonArray hits = searchResult.getJsonObject().get( "hits" ).getAsJsonObject().get( "hits" ).getAsJsonArray(); for ( JsonElement hit : hits ) { EntityInfo entityInfo = searcher.convertQueryHit( hit.getAsJsonObject() ); if ( entityInfo != null ) { results.add( entityInfo ); } } return results; }
private void execute() { searcher = new IndexSearcher(); searchResult = searcher.runSearch(); resultSize = searchResult.getTotal(); }
@AssistedInject public ScrollResult(JestClient jestClient, ObjectMapper objectMapper, @Assisted SearchResult initialResult, @Assisted("query") String query, @Assisted("scroll") String scroll, @Assisted List<String> fields) { super(query, null, initialResult.getJsonObject().path("took").asLong()); this.jestClient = jestClient; this.objectMapper = objectMapper; this.initialResult = initialResult; this.scroll = scroll; this.fields = fields; totalHits = initialResult.getTotal(); scrollId = getScrollIdFromResult(initialResult); final Md5Hash md5Hash = new Md5Hash(getOriginalQuery()); queryHash = md5Hash.toHex(); LOG.debug("[{}] Starting scroll request for query {}", queryHash, getOriginalQuery()); }
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); }
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); }
/** {@inheritDoc} */ @Override public Map<String, Feature> readAll() { SearchResult search = getConnection().search(getBuilder().queryReadAllFeatures(), true); Map<String, Feature> mapOfFeatures = new HashMap<String, Feature>(); if (null != search && search.isSucceeded()) { Integer total = search.getTotal(); SearchResult searchAllResult = getConnection().search(getBuilder().queryReadAllFeatures(total), true); if (null != searchAllResult && searchAllResult.isSucceeded()) { for (Hit<Feature, Void> feature : searchAllResult.getHits(Feature.class)) { mapOfFeatures.put(feature.source.getUid(), feature.source); } } } return mapOfFeatures; }
/** {@inheritDoc} */ @SuppressWarnings("rawtypes") @Override public Map<String, Property<?>> readAllProperties() { SearchResult search = getConnection().search(getBuilder().queryReadAllProperties(), true); Map<String, Property<?>> mapOfProperties = new HashMap<String, Property<?>>(); if (null != search && search.isSucceeded()) { Integer total = search.getTotal(); SearchResult searchAllResult = getConnection().search(getBuilder().queryReadAllProperties(total), true); if (null != searchAllResult && searchAllResult.isSucceeded()) { for (Hit<Property, Void> property : searchAllResult.getHits(Property.class)) { mapOfProperties.put(property.source.getName(), property.source); } } } return mapOfProperties; }
@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)); }
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; } }
@Override public Page<Movie> query(QueryDTO queryDTO, int pageNo, int size) { SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder().from(from(pageNo, size)).size(size); if (queryDTO.getMinScore() != null) { BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder(); RangeQueryBuilder rangeQueryBuilder = new RangeQueryBuilder("score").gte(queryDTO.getMinScore()); boolQueryBuilder.must(rangeQueryBuilder); searchSourceBuilder.query(boolQueryBuilder); } if (queryDTO.getOrderBy() != null) { searchSourceBuilder.sort(queryDTO.getOrderBy(), SortOrder.DESC); } log.debug("搜索DSL:{}", searchSourceBuilder.toString()); Search search = new Search.Builder(searchSourceBuilder.toString()) .addIndex(INDEX) .addType(TYPE) .build(); try { SearchResult result = client.execute(search); List<Movie> movies = result.getSourceAsObjectList(Movie.class, false); int took = result.getJsonObject().get("took").getAsInt(); Page<Movie> page = Page.<Movie>builder().list(movies).pageNo(pageNo).size(size).total(result.getTotal()).took(took).build(); return page; } catch (IOException e) { log.error("search异常", e); return null; } }