# Execute Cosine Similarity inside script\_score function if field is present in the document

**URL:** <https://discuss.elastic.co/t/execute-cosine-similarity-inside-script-score-function-if-field-is-present-in-the-document/253006>\
**Category:** Elasticsearch\
**Tags:** painless\
**Created:** [October 22, 2020, 1:17pm UTC](https://discuss.elastic.co/t/execute-cosine-similarity-inside-script-score-function-if-field-is-present-in-the-document/253006 "2020-10-22T13:17:58Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![SatyaAditya](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/satyaaditya/32/75015_2.png) [@SatyaAditya](https://discuss.elastic.co/u/SatyaAditya)\
**Post date:** [October 22, 2020, 1:17pm UTC](https://discuss.elastic.co/t/execute-cosine-similarity-inside-script-score-function-if-field-is-present-in-the-document/253006/1 "2020-10-22T13:17:59Z")

</div>

I am trying to use cosine similarity in script\_score function. The query is breaking when the dense vector field is missing in the document against which I am trying to measure similarity is missing.

I spent a lot of time searching how to check if the field is present in document or not, but couldn't succeed.

I tried:

1. checking with doc['field\_name'] == null
2. checking with doc['field\_name'].size() == 0
3. checking with doc['field\_name'].value == null

Query i am using is

```auto
POST /sidx-4111c0fc-a8ba-523c-9851-34a2b803643b/_search/
{
  "query": {
    "function_score": {
      "query": {
        "bool": {
          "must": {
            "multi_match": {
              "query": "nri customer bank loan",
              "fields": [],
              "fuzziness": "AUTO"
            }
          }
        }
      },
      "functions": [
        {
          "script_score": {
            "script": {
              "source": "double score =0; score = doc['dense_vector_field'] == null ?0: cosineSimilarity(params.queryVector, 'dense_vector_field'); if(score>=0.8 && score<=1.0){return 10000+score;} else if(score>=0.60 && score<0.80){return score+1000;} else{return score+100}",
              "params": {
                "qv": [1,1,0,1]
              }
            }
          }
        }
      ],
      "boost_mode": "sum"
    }
  }
}

```

i am getting following error

```auto
  "caused_by" : {
            "type" : "illegal_argument_exception",
            "reason" : "No field found for [dense_vector_field] in mapping with types []"
          }
        }

```

can someone please help me

---

<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:** [November 3, 2020, 11:20pm UTC](https://discuss.elastic.co/t/execute-cosine-similarity-inside-script-score-function-if-field-is-present-in-the-document/253006/2 "2020-11-03T23:20:07Z")

</div>

Sorry for a late reply:

You can check if a document is missing a field `myvector` by `doc['myvector'].size() == 0`.  
For example, for a query something like this:

```auto
GET myindex/_search
{
  "query": {
    "script_score" : {
      "query" : {
        "match_all" : {}
      },
      "script" : {
        "source" : "doc['myvector'].size() == 0 ? 1 : cosineSimilarity(params.qv, 'myvector')",
        "params": {
          "qv": [1,1,0,1] 
        }
      }
    }
  }
}

```

---

<div class="post-metadata">

**Author:** ![SatyaAditya](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/satyaaditya/32/75015_2.png) [@SatyaAditya](https://discuss.elastic.co/u/SatyaAditya)\
**Post date:** [November 20, 2020, 10:54am UTC](https://discuss.elastic.co/t/execute-cosine-similarity-inside-script-score-function-if-field-is-present-in-the-document/253006/3 "2020-11-20T10:54:58Z")

</div>

Achieved it using **containsKey** and **size** functions, posting it so that someone may find it helpful

sample query :  
"""  
double score = 0;  
if((doc.containsKey(field\_name)!=false) && (doc[field\_name].size()\>0))  
{score= cosineSimilarity(params.query\_vector, field\_name);}  
"""

---

<div class="post-metadata">

**Author:** ![SatyaAditya](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/satyaaditya/32/75015_2.png) [@SatyaAditya](https://discuss.elastic.co/u/SatyaAditya)\
**Post date:** [November 20, 2020, 10:56am UTC](https://discuss.elastic.co/t/execute-cosine-similarity-inside-script-score-function-if-field-is-present-in-the-document/253006/4 "2020-11-20T10:56:10Z")

</div>

thanks for the reply, size function helped in getting solution for my usecase along with containsKey function

---

<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:** [December 18, 2020, 10:56am UTC](https://discuss.elastic.co/t/execute-cosine-similarity-inside-script-score-function-if-field-is-present-in-the-document/253006/5 "2020-12-18T10:56:19Z")

</div>

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