# Elasticsearch top hits aggregation not working as expected

**URL:** <https://discuss.elastic.co/t/elasticsearch-top-hits-aggregation-not-working-as-expected/48231>\
**Category:** Elasticsearch\
**Created:** [April 23, 2016, 3:18pm UTC](https://discuss.elastic.co/t/elasticsearch-top-hits-aggregation-not-working-as-expected/48231 "2016-04-23T15:18:07Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![abhishek.guruvayya](https://avatars.discourse-cdn.com/v4/letter/a/e9c0ed/32.png) [@abhishek.guruvayya](https://discuss.elastic.co/u/abhishek.guruvayya)\
**Post date:** [April 23, 2016, 3:18pm UTC](https://discuss.elastic.co/t/elasticsearch-top-hits-aggregation-not-working-as-expected/48231/1 "2016-04-23T15:18:07Z")

</div>

I am running the below query and want to retrieve top hits per bucket. But I see multiple docs per bucket in few cases. I want only one document per bucket returned. Can some one review the query and suggest.

> SearchResponse sr=client.prepareSearch(versionIndexName).setTypes(versionIndexType).setQuery(Quer  
> yBuilders.boolQuery().must(QueryBuilders.rangeQuery("indexDate").lte(givenTime)))  
> .addAggregation(AggregationBuilders.terms("form.id").field("form.id").size(0)  
> .subAggregation(AggregationBuilders.topHits("top").setExplain(true).setSize(1)  
> .setFrom((size\*index)).addSort(SortBuilders.fieldSort("indexDate")  
> .order(SortOrder.DESC)).setFetchSource(true))).execute().actionGet();

STEPS in the query:

Filter by indexDate less than or equal to a given date.  
aggregate based on formId. Forming buckets per formId.  
Sort in descending order and return top hit result per bucket.

---

<div class="post-metadata">

**Author:** ![abhishek.guruvayya](https://avatars.discourse-cdn.com/v4/letter/a/e9c0ed/32.png) [@abhishek.guruvayya](https://discuss.elastic.co/u/abhishek.guruvayya)\
**Post date:** [April 23, 2016, 11:18pm UTC](https://discuss.elastic.co/t/elasticsearch-top-hits-aggregation-not-working-as-expected/48231/2 "2016-04-23T23:18:03Z")

</div>

Can any one shed some insight on my query and suggest why top\_hits is not returning one record per bucket instead two.

---

<div class="post-metadata">

**Author:** ![mvg](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/mvg/32/98890_2.png) [@mvg](https://discuss.elastic.co/u/mvg)\
**Post date:** [April 25, 2016, 9:14am UTC](https://discuss.elastic.co/t/elasticsearch-top-hits-aggregation-not-working-as-expected/48231/3 "2016-04-25T09:14:15Z")

</div>

This query looks good. Can you share what ES version you're using?

---

<div class="post-metadata">

**Author:** ![abhishek.guruvayya](https://avatars.discourse-cdn.com/v4/letter/a/e9c0ed/32.png) [@abhishek.guruvayya](https://discuss.elastic.co/u/abhishek.guruvayya)\
**Post date:** [April 25, 2016, 3:35pm UTC](https://discuss.elastic.co/t/elasticsearch-top-hits-aggregation-not-working-as-expected/48231/4 "2016-04-25T15:35:01Z")

</div>

Hi Martijn,

Thanks for the reply. I am using ES 2.1.1 . And another thing i forgot to mention is i am running this against a child index . I mean to say this index is a part of parent and child mapping. Will it make any difference? For example consider, parent index name is "form" and type is "version", child index name is "form" and type is "versionhistory". So i am running this query against index name as "form" and type as"versionhistory". Does tophits aggregation behave differently in parent child scenario?

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/elastic/original/3X/1/a/1ac57faf039f6b580b3f104ef42a2a89e41014de.png) [@system](https://discuss.elastic.co/u/system)\
**Post date:** [July 5, 2017, 10:56pm UTC](https://discuss.elastic.co/t/elasticsearch-top-hits-aggregation-not-working-as-expected/48231/5 "2017-07-05T22:56:27Z")

</div>


