driveall
driveall

Reputation: 301

Elasticsearch set limit and offset using RestHighLevelClient

I search in Elasticsearch using MultiSearchRequest by part of the field:

@Override
public Collection<Map<String, Object>> findContractsByIndexAndWord(String index, String type, String word) throws CommonUserException {
    MultiSearchRequest request = new MultiSearchRequest();
    word = word.toLowerCase();
    request.add(formSearchRequestForMultiSearch(index, type, ID_FIELD, word));
    request.add(formSearchRequestForMultiSearch(index, type, PROVIDER_ID_FIELD, word));

    MultiSearchResponse searchResponse;
    try (RestHighLevelClient client = getClient()) {
        searchResponse = client.multiSearch(request);
        return formContracts(searchResponse);
    } catch (IOException e) {
        throw new CommonUserException(ELASTIC_EXCEPTION, ELASTIC_EXCEPTION);
    }
}

private SearchRequest formSearchRequestForMultiSearch(String index, String type, String field, String word) {
    SearchRequest searchRequest = new SearchRequest(index);
    searchRequest.types(type);
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    searchSourceBuilder.query(QueryBuilders.wildcardQuery(field, word));
    searchRequest.source(searchSourceBuilder);
    return searchRequest;
}
private Collection<Map<String, Object>> formContracts(MultiSearchResponse response) {
    Collection<Map<String, Object>> contracts = new LinkedList<>();
    for (int i = 0; i < response.getResponses().length; i++) {
        SearchHit[] hits = response.getResponses()[i].getResponse().getHits().getHits();
        for (SearchHit hit : hits) {
            if (!contracts.contains(hit.getSourceAsMap())) {
                contracts.add(hit.getSourceAsMap());
            }
        }
    }
    return contracts;
}

How can I add to this request limit and offset of the result?

Upvotes: 2

Views: 7220

Answers (1)

GPI
GPI

Reputation: 9338

From the elasticsearch documentation (last version)

Here are a few examples of some common options:

SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();  //1
sourceBuilder.query(QueryBuilders.termQuery("user", "kimchy"));   //2
sourceBuilder.from(0);                                            //3
sourceBuilder.size(5);                                            //4
sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));       //5
  1. Create a SearchSourceBuilder with default options.
  2. Set the query. Can be any type of QueryBuilder
  3. Set the from option that determines the result index to start searching from. Defaults to 0.
  4. Set the size option that determines the number of search hits to return. Defaults to 10.
  5. Set an optional timeout that controls how long the search is allowed to take.

Size and From are what is usually known as offset/limit.

You may want to have a look at the scroll API if you use it intensively, as offset/limit based result traversal may be kind of slow under certain circumstances, and the scroll API is the way to avoid most of this (if you come from a SQL background as I guess from the limit/offset terminology, think of the Scroll API as the equivalent of keeping a SQL Cursor open to carry on from where you left off iterating).

Upvotes: 4

Related Questions