如何检查弹性搜索无痛参数中是否存在键?

时间:2019-07-01 10:26:11

标签: elasticsearch elasticsearch-dsl elasticsearch-painless

无痛脚本映射参数中如何检查密钥。 在下面的查询中,检查a.toString()键是否存在于参数中 我已经尝试了所有方法,但没有成功。 请帮助我

映射:

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

查询:

{
  "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']"
            }
          }
        }
      ]
    }
  }
}

1 个答案:

答案 0 :(得分:3)

params只是一个Java Map对象。因此,以下检查key中是否存在params,如果不存在则以false退出。

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']
               """
            }
          }
        }
      ]
    }
  }
}