Painless 调试
编辑Painless 调试
编辑Debug.Explain
编辑Painless 没有 REPL(读取-求值-打印循环),虽然有一天它能拥有一个会很好,但这并不能完全说明在 Elasticsearch 中嵌入的 Painless 脚本的调试情况,因为脚本访问的数据或“上下文”非常重要。目前调试嵌入式脚本的最佳方法是在选择的地方抛出异常。虽然您可以抛出自己的异常(throw new Exception('whatever')
),但 Painless 的沙箱会阻止您访问有用的信息,例如对象的类型。因此,Painless 有一个实用方法 Debug.explain
,它会为您抛出异常。例如,您可以使用 _explain
来探索 脚本查询可用的上下文。
PUT /hockey/_doc/1?refresh {"first":"johnny","last":"gaudreau","goals":[9,27,1],"assists":[17,46,0],"gp":[26,82,1]} POST /hockey/_explain/1 { "query": { "script": { "script": "Debug.explain(doc.goals)" } } }
这表明 doc.first
的类是 org.elasticsearch.index.fielddata.ScriptDocValues.Longs
,响应如下:
{ "error": { "type": "script_exception", "to_string": "[1, 9, 27]", "painless_class": "org.elasticsearch.index.fielddata.ScriptDocValues.Longs", "java_class": "org.elasticsearch.index.fielddata.ScriptDocValues$Longs", ... }, "status": 400 }
您可以使用相同的技巧来查看在 _update
API 中,_source
是一个 LinkedHashMap
。
POST /hockey/_update/1 { "script": "Debug.explain(ctx._source)" }
响应如下:
{ "error" : { "root_cause": ..., "type": "illegal_argument_exception", "reason": "failed to execute script", "caused_by": { "type": "script_exception", "to_string": "{gp=[26, 82, 1], last=gaudreau, assists=[17, 46, 0], first=johnny, goals=[9, 27, 1]}", "painless_class": "java.util.LinkedHashMap", "java_class": "java.util.LinkedHashMap", ... } }, "status": 400 }
一旦您有了类,您可以转到 Painless API 参考 查看可用方法的列表。