Painless 调试

原文链接 : https://www.elastic.co/guide/en/elasticsearch/reference/5.3/modules-scripting-painless-debugging.html

译文链接 : http://www.apache.wiki/pages/viewpage.action?pageId=10027222

贡献者 : @琴剑蓝天ApacheCNApache中文网

Painless 脚本语言是新的,仍然被标记为实验性语言。 如果需要,语法或API可能会以非向后兼容的方式在将来更改。

Debug.Explain

Painless 没有 REPL,虽然它有一天会很好,但它不会告诉你关于调试嵌入在弹性搜索中的 Painless 脚本的整个故事,因为脚本可以访问或“上下文 “是如此重要。 现在调试嵌入式脚本的最佳方法是在选择的地方抛出异常。 虽然你可以抛出你自己的异常(抛出新的异常

(’whatever’)),Painless 的沙箱阻止你访问有用的信息,如对象的类型。 所以 Painless 有一个实用的方法,Debug.explain 为你抛出异常。 例如,您可以使用 Explain API 来探索脚本查询可用的上下文。

  1. PUT /hockey/player/1?refresh
  2. {"first":"johnny","last":"gaudreau","goals":[9,27,1],"assists":[17,46,0],"gp":[26,82,1]}
  3. POST /hockey/player/1/_explain
  4. {
  5. "query": {
  6. "script": {
  7. "script": "Debug.explain(doc.goals)"
  8. }
  9. }
  10. }

这表明 doc.first 的类是 org.elasticsearch.index.fielddata.ScriptDocValues.Longs 通过响应:

  1. {
  2. "error": {
  3. "type": "script_exception",
  4. "to_string": "[1, 9, 27]",
  5. "painless_class": "org.elasticsearch.index.fielddata.ScriptDocValues.Longs",
  6. "java_class": "org.elasticsearch.index.fielddata.ScriptDocValues$Longs",
  7. ...
  8. },
  9. "status": 500
  10. }

您可以使用相同的技巧来查看 source_ 是 update API 中的 _LinkedHashMap

  1. POST /hockey/player/1/_update
  2. {
  3. "script": "Debug.explain(ctx._source)"
  4. }

响应如下:

  1. {
  2. "error" : {
  3. "root_cause": ...,
  4. "type": "illegal_argument_exception",
  5. "reason": "failed to execute script",
  6. "caused_by": {
  7. "type": "script_exception",
  8. "to_string": "{gp=[26, 82, 1], last=gaudreau, assists=[17, 46, 0], first=johnny, goals=[9, 27, 1]}",
  9. "painless_class": "LinkedHashMap",
  10. "java_class": "java.util.LinkedHashMap",
  11. ...
  12. }
  13. },
  14. "status": 400
  15. }

一旦你有一个类,你可以去附录A,Painless API参考,看看可用的方法的列表。