Elasticsearch top hits aggregation not working as expected

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.

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

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

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?