如何在 java 代码中使用 elasticsearch painless BigDecimal?

How to use elasticsearch painless BigDecimal in java code?

我使用无痛更新文档。如何使用 BigDecimal 完成它?使用 Elasticsearch 6.8.1。 Script JavaDoc 脚本构造器是:

public Script (ScriptType type,
              java.lang.String lang,
              java.lang.String idOrCode,
              java.util.Map<java.lang.String, java.lang.Object> params)

我的密码是:

StringBuilder script = new StringBuilder();
Map<String, Object> params = new HashMap<>();
params.put("poundageRate", poundageRate.doubleValue());
script.append("ctx._source.poundage=ctx._source.amount*params.poundageRate;");
Script scriptObj = new Script(INLINE, DEFAULT_SCRIPT_LANG, script.toString(), params);

我的问题是: 如何让 ctx._source.amount*params.poundageRate 使用 BigDecimal 方法 相乘和 setScale

new BigDecimal("ctx._source.amount").multiply(new BigDecimal("params.poundageRate")).setScale(2, HALF_UP).stripTrailingZeros()

非常感谢,我会很感激

BigDecimal 绝对是 supported ES 6.8 中的 Painless。

您应该将 poundageRate 参数作为字符串而不是将其转换为双精度值。

params.put("poundageRate", poundageRate.toString());

然后,您的脚本可以包含您显示的代码(稍作修改),即

ctx._source.amount = new BigDecimal(ctx._source.amount).multiply(new BigDecimal(params.poundageRate)).setScale(2, RoundingMode.HALF_UP).stripTrailingZeros()

试试看,效果不错