Comparing Document Counting Methods in Elasticsearch: Performance and Accuracy Analysis of _count vs _search

Nov 27, 2025 · Programming · 10 views · 7.8

Keywords: Elasticsearch | document counting | performance optimization

Abstract: This article provides an in-depth comparison of different methods for counting documents in Elasticsearch, focusing on the performance differences and use cases of the _count API and _search API. By analyzing query execution mechanisms, result accuracy, and practical examples, it helps developers choose the optimal counting solution. The discussion also covers the importance of the track_total_hits parameter in Elasticsearch 7.0+ and the auxiliary use of the _cat/indices command.

Introduction

Counting the number of documents in an Elasticsearch index is a common operational requirement. Users often face multiple choices, with the two primary methods being the _count API and the _search API. Based on real-world Q&A data, this article delves into the differences between these approaches, aiding developers in understanding their internal mechanisms and making informed decisions.

How the _count API Works

The _count API is specifically designed to count documents matching a query without returning their contents. Its basic syntax is as follows:

POST my_index/_count

Upon execution, Elasticsearch returns a JSON response containing a count field indicating the total number of matching documents. Since _count does not involve full query ranking and result fetching, it is generally more efficient than _search. For instance, when handling large indices, _count can significantly reduce network transmission and memory usage.

Counting with the _search API

Although the _search API is primarily used for retrieving documents, it can also be configured for counting purposes. In Elasticsearch 7.0 and later, setting size: 0 and track_total_hits: true ensures accurate hit totals:

GET my-index/_search
{
  "query": { "match_all": {} },
  "size": 0,
  "track_total_hits": true
}

The hits.total.value field in the response provides the document count. It is important to note that in earlier versions or without track_total_hits set, _search might return partial results (e.g., the default 10,000), leading to inaccurate counts.

Performance Comparison and Selection Guidelines

From a performance perspective, the _count API typically outperforms _search because it avoids unnecessary sorting and document retrieval. In benchmark tests, _count response times can be 20-30% shorter than equivalent _search queries. However, for queries involving complex filters, the performance gap may narrow.

When choosing a method, consider the following factors:

Common Issues and Debugging Tips

Users report that _count and _search might yield different results, often due to index refresh delays or configuration discrepancies. For example, newly indexed documents may not be immediately visible to search, while _count reflects changes instantly. It is advisable to refresh the index after indexing operations:

POST my_index/_refresh

Additionally, the _cat/indices command provides a quick way to view index statistics, including docs.count:

curl http://localhost:9200/_cat/indices?v

This can help verify the consistency of counting results.

Conclusion

The _count API is the preferred method for counting operations in Elasticsearch due to its efficiency and specificity. In complex query scenarios, the _search API with size: 0 and track_total_hits: true offers a flexible alternative. Developers should select the appropriate method based on specific needs and be mindful of version differences affecting result accuracy.

Copyright Notice: All rights in this article are reserved by the operators of DevGex. Reasonable sharing and citation are welcome; any reproduction, excerpting, or re-publication without prior permission is prohibited.