# IN equivalent operator in painless inline scripts

**URL:** <https://discuss.elastic.co/t/in-equivalent-operator-in-painless-inline-scripts/149634>\
**Category:** Elasticsearch\
**Created:** [September 24, 2018, 8:30am UTC](https://discuss.elastic.co/t/in-equivalent-operator-in-painless-inline-scripts/149634 "2018-09-24T08:30:15Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![shobhana](https://avatars.discourse-cdn.com/v4/letter/s/5daacb/32.png) [@shobhana](https://discuss.elastic.co/u/shobhana)\
**Post date:** [September 24, 2018, 8:30am UTC](https://discuss.elastic.co/t/in-equivalent-operator-in-painless-inline-scripts/149634/1 "2018-09-24T08:30:15Z")

</div>

I want to achieve the equivalent of the following SQL query using inline scripts of ES (painless language) :  
where userId in (1, 2, 3) ----\> Here userId is a long field

I tried with the following :  
POST ride/ride/\_search  
{  
"query": {  
"bool": {  
"filter": [  
{  
"script": {  
"script": {  
"source": "doc['userId'].value in [1, 2, 3]"  
}  
}  
}  
]  
}  
}  
}

but saw an error :  
"caused\_by": {  
"type": "script\_exception",  
"reason": "compile error",  
"script\_stack": [  
"doc['userId'].value in [1, 2, 3]",  
" ^---- HERE"  
],  
"script": "doc['userId'].value in [1, 2, 3]",  
"lang": "painless",  
"caused\_by": {  
"type": "illegal\_argument\_exception",  
"reason": "invalid sequence of tokens near ['in'].",  
"caused\_by": {  
"type": "no\_viable\_alt\_exception",  
"reason": null  
}  
}  
}

Is there a way to achieve this using inline scripts? I know that this can be achieved using terms, but I am looking for a way to add this as part of another inline script query.

Thanks in advance.

Regards,  
Shobhana

---

<div class="post-metadata">

**Author:** ![dadoonet](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/dadoonet/32/137187_2.png) [@dadoonet](https://discuss.elastic.co/u/dadoonet)\
**Post date:** [September 24, 2018, 10:37am UTC](https://discuss.elastic.co/t/in-equivalent-operator-in-painless-inline-scripts/149634/2 "2018-09-24T10:37:31Z")

</div>

Why using a script for this?

---

<div class="post-metadata">

**Author:** ![shobhana](https://avatars.discourse-cdn.com/v4/letter/s/5daacb/32.png) [@shobhana](https://discuss.elastic.co/u/shobhana)\
**Post date:** [September 24, 2018, 11:21am UTC](https://discuss.elastic.co/t/in-equivalent-operator-in-painless-inline-scripts/149634/3 "2018-09-24T11:21:21Z")

</div>

I want to include this as a sub-query in another script which has several other conditions which I could not model without using the scripts. Some distinct part of the existing inline query is shown below :

```
{
  "query": {
    "bool": {
      "filter": [
        {
          "range": {
            "startTime": {
              "lt": "Sep 24, 2018 1:05:04 PM"
            }
          }
        },
        {
          "range": {
            "expectedEndTime": {
              "gt": "Sep 24, 2018 12:12:04 PM"
            }
          }
        },
        {
          "script": {
            "script": {
              "source": "(doc['status'].value == 'Scheduled' || doc['status'].value == 'Started' || doc['status'].value == 'Delayed') && doc['distance'].value >= params.minDistance && doc['startPoint'].arcDistance(params.fromLat, params.fromLon) <= (doc['distance'].value >= params.rideDistance ? doc['distance'].value : params.rideDistance) * 1000",
              "params": {
                "toLat": 12.983942,
                "minDistance": 14.8253,
                "fromLon": 77.621174,
                "toLon": 77.477552,
                "fromLat": 13.044056,
                "maxDistance": 36.9432,
                "rideDistance": 20.3
              }
            }
          }
        }
      ]
    }
  }
} 

```

I want to include the query mentioned in my original question to the inline script mentioned above.

---

<div class="post-metadata">

**Author:** ![Christian\_Dahlqvist](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/christian_dahlqvist/32/4617_2.png) [@Christian\_Dahlqvist](https://discuss.elastic.co/u/Christian_Dahlqvist)\
**Post date:** [September 24, 2018, 11:24am UTC](https://discuss.elastic.co/t/in-equivalent-operator-in-painless-inline-scripts/149634/4 "2018-09-24T11:24:20Z")

</div>

Scripts run per document, and can not be used to run sub-queries.

---

<div class="post-metadata">

**Author:** ![shobhana](https://avatars.discourse-cdn.com/v4/letter/s/5daacb/32.png) [@shobhana](https://discuss.elastic.co/u/shobhana)\
**Post date:** [September 24, 2018, 12:05pm UTC](https://discuss.elastic.co/t/in-equivalent-operator-in-painless-inline-scripts/149634/5 "2018-09-24T12:05:28Z")

</div>

Pardon my use of the word "sub-query" .. I just intended to say that I want to include the IN criteria as another condition in the existing script :

"source": "(doc['status'].value == 'Scheduled' || doc['status'].value == 'Started' || doc['status'].value == 'Delayed') && ( **doc['userId].value IN [params.userIdList] ||** (doc['distance'].value \>= params.minDistance && doc['startPoint'].arcDistance(params.fromLat, params.fromLon) \<= (doc['distance'].value \>= params.rideDistance ? doc['distance'].value : params.rideDistance) \* 1000))"

---

<div class="post-metadata">

**Author:** ![Christian\_Dahlqvist](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/christian_dahlqvist/32/4617_2.png) [@Christian\_Dahlqvist](https://discuss.elastic.co/u/Christian_Dahlqvist)\
**Post date:** [September 24, 2018, 12:08pm UTC](https://discuss.elastic.co/t/in-equivalent-operator-in-painless-inline-scripts/149634/6 "2018-09-24T12:08:23Z")

</div>

Would it not be easier, and possibly more performant, to do so using a [terms query](https://www.elastic.co/guide/en/elasticsearch/reference/6.4/query-dsl-terms-query.html)?

---

<div class="post-metadata">

**Author:** ![shobhana](https://avatars.discourse-cdn.com/v4/letter/s/5daacb/32.png) [@shobhana](https://discuss.elastic.co/u/shobhana)\
**Post date:** [September 24, 2018, 12:35pm UTC](https://discuss.elastic.co/t/in-equivalent-operator-in-painless-inline-scripts/149634/7 "2018-09-24T12:35:16Z")

</div>

To be honest, I tried a lot writing a terms query first, but I couldn't figure out how to design my query to match the above. Later I found inline scripts section and prepared a query to match the above constraints. I couldn't identify how to mix && and|| together and also include max(field1, constant1) in the same query!

---

<div class="post-metadata">

**Author:** ![shobhana](https://avatars.discourse-cdn.com/v4/letter/s/5daacb/32.png) [@shobhana](https://discuss.elastic.co/u/shobhana)\
**Post date:** [September 25, 2018, 6:24am UTC](https://discuss.elastic.co/t/in-equivalent-operator-in-painless-inline-scripts/149634/8 "2018-09-25T06:24:10Z")

</div>

Is it possible to use IN operator in scripts?

---

<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:** [October 23, 2018, 6:24am UTC](https://discuss.elastic.co/t/in-equivalent-operator-in-painless-inline-scripts/149634/9 "2018-10-23T06:24:17Z")

</div>

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