# Need help with ScriptedMetricAggregation in Elasticsearch v8.7

**URL:** <https://discuss.elastic.co/t/need-help-with-scriptedmetricaggregation-in-elasticsearch-v8-7/350088>\
**Category:** Elasticsearch\
**Created:** [December 28, 2023, 4:08pm UTC](https://discuss.elastic.co/t/need-help-with-scriptedmetricaggregation-in-elasticsearch-v8-7/350088 "2023-12-28T16:08:38Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![Chetan\_Ramaiah](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/chetan_ramaiah/32/48571_2.png) [@Chetan\_Ramaiah](https://discuss.elastic.co/u/Chetan_Ramaiah)\
**Post date:** [December 28, 2023, 4:08pm UTC](https://discuss.elastic.co/t/need-help-with-scriptedmetricaggregation-in-elasticsearch-v8-7/350088/1 "2023-12-28T16:08:38Z")

</div>

Hello,

I am working on migrating ES 6.8 java code to ES 8.7.1 rest API java. But, I am unable to understand or find how to write script metric aggregation with ES 8.7.1. Could you please guide me using the below code from ES 6.8.

```auto
if (comp != null) 
{
	termAggregation = AggregationBuilders.terms("comp").field("eid").size(10000);
	scriptedMetricAggregationBuilder = AggregationBuilders.scriptedMetric("unique_es_count");
	scriptedMetricAggregationBuilder.initScript(new Script("state.map = [:]"));
	scriptedMetricAggregationBuilder.mapScript(new Script("if(doc['eid'] != null){" + "if (!state.map.containsKey(doc['eid'].value)){ state.map[doc['eid'].value]=1;}}"));
	scriptedMetricAggregationBuilder.combineScript(new Script("return state.map;"));
	scriptedMetricAggregationBuilder.reduceScript(new Script("int count=0; def final = [:]; for (map in states){ for (entry in map.entrySet()) { if (!final.containsKey(entry.getKey())){ final[entry.getKey()] = 1; count +=1;}}} return count;"));
	
	termAggregation1 = AggregationBuilders.topHits("distinct")
			.size(1)
			.fetchSource(includeFields, excludeFields);
	termAggregation.subAggregation(termAggregation1);
	termAggregation.subAggregation(AggregationBuilders.sum("totexp").field("expense"));
	termAggregation.subAggregation(new BucketSortPipelineAggregationBuilder("expsort", null).from(from-1).size(size));
	searchSourceBuilder.aggregation(scriptedMetricAggregationBuilder);
}

```

Thanks in advance  
Chetan

---

<div class="post-metadata">

**Author:** ![RabBit\_BR](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/rabbit_br/32/82261_2.png) [@RabBit\_BR](https://discuss.elastic.co/u/RabBit_BR)\
**Post date:** [December 28, 2023, 6:36pm UTC](https://discuss.elastic.co/t/need-help-with-scriptedmetricaggregation-in-elasticsearch-v8-7/350088/2 "2023-12-28T18:36:49Z")

</div>

Hi @Chetan_Ramaiah

See this example, maybe need some fixes.

```
var scriptedMetricAggregationBuilder = AggregationBuilders
    .scriptedMetric(sm -> sm
        .initScript(Script.of(s -> s.inline(InlineScript.of(is -> is.source("state.map = [:]")))))
        .mapScript(Script.of(s -> s.inline(InlineScript.of(is -> is
            .source("if(doc['eid'] != null){\" + \"if (!state.map.containsKey(doc['eid'].value)){ state.map[doc['eid'].value]=1;}}")))))
        .combineScript(Script.of(s -> s.inline(InlineScript.of(is -> is.source("return state.map;")))))
        .reduceScript(Script.of(s -> s.inline(InlineScript.of(is -> is.source(
            "int count=0; def final = [:]; for (map in states){ for (entry in map.entrySet()) { if (!final.containsKey(entry.getKey())){ final[entry.getKey()] = 1; count +=1;}}} return count;")))))
    );

map.put("unique_es_count", scriptedMetricAggregationBuilder);

SearchRequest searchRequest = new SearchRequest.Builder()
    .aggregations(map)
    .build();

```

---

<div class="post-metadata">

**Author:** ![Chetan\_Ramaiah](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/chetan_ramaiah/32/48571_2.png) [@Chetan\_Ramaiah](https://discuss.elastic.co/u/Chetan_Ramaiah)\
**Post date:** [December 29, 2023, 9:58am UTC](https://discuss.elastic.co/t/need-help-with-scriptedmetricaggregation-in-elasticsearch-v8-7/350088/3 "2023-12-29T09:58:38Z")

</div>

Will try this approach and keep you posted. Thanks @RabBit_BR

---

<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:** [January 26, 2024, 9:58am UTC](https://discuss.elastic.co/t/need-help-with-scriptedmetricaggregation-in-elasticsearch-v8-7/350088/4 "2024-01-26T09:58:38Z")

</div>

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.
