elasticsearch - 在Groovy中动态访问JSON对象

标签 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错误消息。

最佳答案

您的内联脚本需要改成这样:

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

还要确保您有enabled dynamic scripting

关于elasticsearch - 在Groovy中动态访问JSON对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38592345/

相关文章:

java - Spock - 返回固定值不按预期工作

elasticsearch - elasticsearch must_not条件子句不起作用

json - Grails 3 JSON 渲染无法渲染列表?

arrays - 如何从数组或列表中选择所有值?

elasticsearch - 如何调整ECK群集的大小

regex - Jenkins Groovy 控制台日志上的构建后插件多行正则表达式

groovy - 除了 Groovy 之外,最接近 CPAN 的是什么?

c# - 如何通过 HTTP 从 C# 查询 Elasticsearch?

java - Elasticsearch 可能无法启动..尝试了多个版本

elasticsearch - 无法使用NEST将动态对象插入Elastic Search