在Groovy中动态访问JSON对象

时间:2016-07-26 14:15:47

标签: elasticsearch groovy

以下是我需要发送给ElasticSearch的查询:

{
  "query": {
    "match_all":{}
  },
  "sort": {
    "_script": {
      "type":"number",
      "script": {
        "inline":"statusMap[status] || 0",
        "params": {
          "statusMap": {
            "CAN":5,
            "COM":4,
            "HLD":3,
            "PEN":2,
            "INP":1
          }
        }
      },
      "order":"desc"
    }
  }
}

其中status是字符串类型的字段。参数statusMap的值可能因查询而异,我认为只需指定映射值就可以解决这个问题,因为无论如何这都是有效的JavaScript。然后我意识到脚本不是JS,而是Groovy。

问题是Groovy根本不喜欢statusMap[status]。这个JavaScript表达式在Groovy中是等效的吗?如果没有,有哪些替代方案?

修改

错误消息是

{
   "error": {
      "root_cause": [
         {
            "type": "script_exception",
            "reason": "failed to run inline script [statusMap[status]] using lang [groovy]"
         }
      ],
      "type": "search_phase_execution_exception",
      "reason": "all shards failed",
      "phase": "query",
      "grouped": true,
      "failed_shards": [
         {
            "shard": 0,
            "index": "foo",
            "node": "8AcXwANfSd-HF-nyMXHDLw",
            "reason": {
               "type": "script_exception",
               "reason": "failed to run inline script [statusMap[status]] using lang [groovy]",
               "caused_by": {
                  "type": "missing_property_exception",
                  "reason": "No such property: status for class: 5ea995c6862849ebdbc5e3d4126d81302185a798"
               }
            }
         }
      ]
   },
   "status": 500
}

注意:statusMap[status]更改为statusMap[doc.status.value]会产生null_pointer_exception错误消息。

1 个答案:

答案 0 :(得分:1)

你的内联脚本必须是这样的:

    "inline":"statusMap[doc.status.value] ?: 0",

同时确保您拥有enabled dynamic scripting