# Using cosineSimilarity function inside aggregation scripts

**URL:** <https://discuss.elastic.co/t/using-cosinesimilarity-function-inside-aggregation-scripts/308046>\
**Category:** Elasticsearch\
**Created:** [June 23, 2022, 5:02pm UTC](https://discuss.elastic.co/t/using-cosinesimilarity-function-inside-aggregation-scripts/308046 "2022-06-23T17:02:49Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![lonewolf](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/lonewolf/32/104141_2.png) [@lonewolf](https://discuss.elastic.co/u/lonewolf)\
**Post date:** [June 23, 2022, 5:02pm UTC](https://discuss.elastic.co/t/using-cosinesimilarity-function-inside-aggregation-scripts/308046/1 "2022-06-23T17:02:50Z")

</div>

I am trying to use cosineSimilarity function inside in aggregation script but getting

> Unknown call [cosine Similarity] with [2] arguments

```auto
{
    "query": {
        "match_all": {}
    },
    "aggs": {
        "group": {
            "terms": {
                "field": "group"
            },
            "aggs": {
                "profit": {
                    "scripted_metric": {
                        "params": {
                             "que_vec": [1,2,3], "ans_vec": [3,4,5]
                        },
                        "init_script": "state.scores = [:]",
                        "map_script": "double score = 0; if (doc.type.value == 'question') { score = cosineSimilarity(params.que_vec, doc.vector) } else { score = cosineSimilarity(params.ans_vec, doc.vector) } if (score > state.scores.getOrDefault(doc.type.value, 0)) { state.scores[doc.type.value] = score }",
                        "combine_script": "return state.scores",
                        "reduce_script": "return states"
                    }
                }
            }
        }
    }
}

```

---

<div class="post-metadata">

**Author:** ![mayya](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/mayya/32/83147_2.png) [@mayya](https://discuss.elastic.co/u/mayya)\
**Post date:** [July 12, 2022, 4:39pm UTC](https://discuss.elastic.co/t/using-cosinesimilarity-function-inside-aggregation-scripts/308046/2 "2022-07-12T16:39:08Z")

</div>

@lonewolf`cosineSimilarity` function is not available in this context. It is only available only in [score context](https://www.elastic.co/guide/en/elasticsearch/painless/current/painless-score-context.html). Different painless contexts have different functions available for them.

Can you please describe your use case? Why do you need `cosineSimilarity` to calculate aggregation results?

---

<div class="post-metadata">

**Author:** ![lonewolf](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/lonewolf/32/104141_2.png) [@lonewolf](https://discuss.elastic.co/u/lonewolf)\
**Post date:** [July 12, 2022, 5:10pm UTC](https://discuss.elastic.co/t/using-cosinesimilarity-function-inside-aggregation-scripts/308046/3 "2022-07-12T17:10:16Z")

</div>

I wish to compare a given query (which is a set of vectors) to all documents (vectors) in the index. The documents in the index will aggregated into buckets and then for each bucket, pairwise cosine similarity carried between vectors in bucket and vectors in query. Finally, highest cosine score and corresponding pair will be returned.

If I carry out the cosine similarity calculation in score script, the result will be available as "\_score" field in aggregation and this would allow me to calculate highest cosine score for a bucket. But it would not be possible to find out which pair of vectors contributed to highest score.

---

<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:** [August 9, 2022, 5:10pm UTC](https://discuss.elastic.co/t/using-cosinesimilarity-function-inside-aggregation-scripts/308046/4 "2022-08-09T17:10:23Z")

</div>

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