Elasticsearch Java API - How to get the number of documents without retrieving the documents

13,079

Solution 1

Use the search API, but set it to return no documents and retrieve the count of hits from the SearchResponse object it returns.

For example:

import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchType;
import org.elasticsearch.index.query.QueryBuilders.*;

SearchResponse response = client.prepareSearch("your_index_goes_here")
    .setTypes("YourTypeGoesHere")
    .setQuery(QueryBuilders.termQuery("some_field", "some_value"))
    .setSize(0) // Don't return any documents, we don't need them.
    .get();

SearchHits hits = response.getHits();
long hitsCount = hits.getTotalHits();

Solution 2

Elastic - Indices Stats

Indices level stats provide statistics on different operations happening on an index. The API provides statistics on the index level scope (though most stats can also be retrieved using node level scope).

prepareStats(indexName) client.admin().indices().prepareStats(indexName).get().getTotal().getDocs().getCount();

Solution 3

Just an addition to @evanjd's answer

import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchType;
import org.elasticsearch.index.query.QueryBuilders.*;

 SearchResponse response = client.prepareSearch("your_index_goes_here")
   .setTypes("YourTypeGoesHere")
   .setQuery(QueryBuilders.termQuery("some_field", "some_value"))
   .setSize(0) // Don't return any documents, we don't need them.
   .get();

 SearchHits hits = response.getHits();
 long hitsCount = hits.getTotalHits().value;

we need to add .value to get long value of total hits otherwise it will be a string value like "6 hits"

long hitsCount = hits.getTotalHits().value;

long hitsCount = hits.getTotalHits().value;

Solution 4

Breaking changes after 7.0; you need to set track_total_hits to true explicitly in the search request.

https://www.elastic.co/guide/en/elasticsearch/reference/current/breaking-changes-7.0.html#track-total-hits-10000-default

Solution 5

We can also get lowLevelClient from highLevelClient and invoke the "_count" rest API like "GET /twitter/_doc/_count?q=user:kimchy".

Share:
13,079
ash__999
Author by

ash__999

Updated on June 13, 2022

Comments