Search code examples
elasticsearchelasticsearch-dslelasticsearch-painless

how to check for key exist in elastic-search painless parameters?


How to check for key exists in painless script map parameters. In below query check a.toString() key exist in params I've tried everything but didn't get it to work. Please help me

mapping :

"id": {
   "type": "long"
}

query:

{
  "query":{
    "bool":{
      "filter":[
        {
          "script": {
            "script": {
               "lang": "painless",
               "params": {
                 "29232":2541,
                 "minDistance": 0
               },
               "source": "def a=doc['id'].getValue();double distance=params[a.toString()]; return distance <= 1000 && distance >= params['minDistance']"
            }
          }
        }
      ]
    }
  }
}

Solution

  • The params is just a Java Map object. So, the following checks if the key exists in the params and exits early with a false if it does not exist.

    GET test/_search
    {
      "query":{
        "bool":{
          "filter":[
            {
              "script": {
                "script": {
                   "lang": "painless",
                   "params": {
                     "29232":2541,
                     "minDistance": 0
                   },
                   "source": """
                   def a=doc['id'].getValue();
                   if (!params.containsKey(a.toString())) {
                     return false;
                   }
                   double distance=params[a.toString()]; 
                   return distance <= 1000 && distance >= params['minDistance']
                   """
                }
              }
            }
          ]
        }
      }
    }