Cannot apply [>] operation to types [ScriptDocValues.Doubles] and [java.lang.Integer]

在使用elasticsearch脚本指标统计时,出现了异常:
脚本:

POST account_test/_search?size=0
{
  "query": {
    "match_all": {}
  },
  "aggs": {
    "balance_positive_sum": {
      "scripted_metric": {
        "init_script": "state.balances=[]",
        "map_script": "if(doc.balance > 0){state.balances.add( doc.balance)}",
        "combine_script": "double balanceSum=0;for(num in state.balances){balanceSum+=num} return balanceSum ",
        "reduce_script": "double balanceSum=0;for(num in states){balanceSum+=num} return balanceSum"
      }
    }
  }
}

异常:

{
  "error": {
    "root_cause": [
      {
        "type": "class_cast_exception",
        "reason": "class_cast_exception: Cannot apply [>] operation to types [org.elasticsearch.index.fielddata.ScriptDocValues.Doubles] and [java.lang.Integer]."
      }
    ],
    "type": "search_phase_execution_exception",
    "reason": "all shards failed",
    "phase": "query",
    "grouped": true,
    "failed_shards": [
      {
        "shard": 0,
        "index": "account_test",
        "node": "cdYh0ptNTP6kMXlVSE8dqA",
        "reason": {
          "type": "script_exception",
          "reason": "runtime error",
          "script_stack": [
            "if(doc.balance > 0){",
            "      ^---- HERE"
          ],
          "script": "if(doc.balance > 0){state.balances.add( doc.balance)}",
          "lang": "painless",
          "caused_by": {
            "type": "class_cast_exception",
            "reason": "class_cast_exception: Cannot apply [>] operation to types [org.elasticsearch.index.fielddata.ScriptDocValues.Doubles] and [java.lang.Integer]."
          }
        }
      }
    ],
    "caused_by": {
      "type": "class_cast_exception",
      "reason": "class_cast_exception: Cannot apply [>] operation to types [org.elasticsearch.index.fielddata.ScriptDocValues.Doubles] and [java.lang.Integer]."
    }
  },
  "status": 400
}

原因是在脚本中balance对应的类型是ScriptDocValues.Doubles,也就是封装类型,能直接执行>、<、=等操作,需要转原始类型。

解决办法:
调用getValue() 方法或者原始值。

POST account_test/_search?size=0
{
  "query": {
    "match_all": {}
  },
  "aggs": {
    "balance_positive_sum": {
      "scripted_metric": {
        "init_script": "state.balances=[]",
        "map_script": "if(doc.balance.getValue() > 0){state.balances.add( doc.balance.getValue())}",
        "combine_script": "double balanceSum=0;for(num in state.balances){balanceSum+=num} return balanceSum ",
        "reduce_script": "double balanceSum=0;for(num in states){balanceSum+=num} return balanceSum"
      }
    }
  }
}

更多方法参考:ScriptDocValues.Doubles Java Doc。

  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冲上云霄的Jayden

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值