Correct. Kibana is firing off various
date_histogram aggregations, based on the options you've toggled in the dashboard (fields, interval, range, etc). Elasticsearch is then building the buckets at the specified interval and returning the result.
This is exactly what I was going to suggest The query-cache is designed to help out with situations like this, where a single query/agg is repeatedly executed. If the response doesn't change, it can be cached.
But, as @lwintergerst points out, Kibana doesn't play very nicely with the feature yet because the time ranges slide and invalidate immediately. Using custom time ranges instead of now- would work, or something like the suggested "magnet" functionality.
In the future, we'd like to make the query cache "smarter". For example, if you are querying five days across five indices, even if you do
now - 5d we know that the "interior" three indices are valid from the last query, and could cache those shard level results. That means only the two "edge" indices would need to be re-queried.
It's not possible today, but there is a lot of work going on to clean up the internal Query parsing to make stuff like this possible.