如何使用无痛脚本获取 foreach 管道指令的当前条目?

How to get the current entry of a foreach pipeline instruction using painless scripting?

我正在尝试根据标志计算 JSON 个对象。 为此,我创建了两个遍历我的对象的 foreach 管道。

我想统计 documents 数组中字段 "count" 设置为 true 的所有对象。

POST _ingest/pipeline/_simulate
{  
   "pipeline":{  
      "description":"...",
      "processors":[  
         {  
            "set":{  
               "field":"specific.docCount",
               "value":0
            }
         },
         {  
            "foreach":{  
               "field":"data.status.transactions",
               "processor":{  
                  "foreach":{  
                     "field":"_ingest._value.documents",
                     "processor":{  
                        "script":{  
                           "lang":"painless",
                           "inline":"if (ctx.count) ctx.specific.docCount += 1"
                        }
                     }
                  }
               }
            }
         }
      ]
   },
   "docs":[  
      {  
         "_source":{  
            "data":{  
               "status":{  
                  "transactions":[  
                     {  
                        "id":"123",
                        "documents":[  
                           {  
                              "count": true
                           },
                           {
                              "count": false
                           }
                        ]
                     }
                  ]
               }
            }
         }
      }
   ]
}

我收到以下错误:

{
  "docs": [
    {
      "error": {
        "root_cause": [
          {
            "type": "exception",
            "reason": "java.lang.IllegalArgumentException: ScriptException[runtime error]; nested: NullPointerException;",
            "header": {
              "processor_type": "foreach"
            }
          }
        ],
        "type": "exception",
        "reason": "java.lang.IllegalArgumentException: ScriptException[runtime error]; nested: NullPointerException;",
        "caused_by": {
          "type": "illegal_argument_exception",
          "reason": "ScriptException[runtime error]; nested: NullPointerException;",
          "caused_by": {
            "type": "script_exception",
            "reason": "runtime error",
            "script_stack": [
              "if (ctx.count) ",
              "       ^---- HERE"
            ],
            "script": "if (ctx.count) ctx.stats.docCount += 1",
            "lang": "painless",
            "caused_by": {
              "type": "null_pointer_exception",
              "reason": null
            }
          }
        },
        "header": {
          "processor_type": "foreach"
        }
      }
    }
  ]
}

这个 foreach pipeline doc 建议使用 ctx 来引用摄取文档,但我不确定如何在我的情况下使用它。

如何在我的无痛脚本中检索当前 "foreach entry"?

我最终在无痛脚本中完成了整个事情。

POST _ingest/pipeline/_simulate
{  
   "pipeline":{  
      "description":"...",
      "processors":[  
         {  
            "set":{  
               "field":"stats.docCount",
               "value":0
            }
         },
         {  
            "script":{  
               "lang":"painless",
               "inline":"def transactions = ctx.data.status.transactions; for (def transaction : transactions) {def documents = transaction.documents; for (def document : documents){if (document.count != null && document.count){ctx.stats.docCount += 1}}}"
            }
         }
      ]
   },
   "docs":[  
      {  
         "_source":{  
            "data":{  
               "status":{  
                  "transactions":[  
                     {  
                        "id":"123",
                        "documents":[  
                           {  
                              "count":true
                           },
                           {  
                              "count":false
                           }
                        ]
                     }
                  ]
               }
            }
         }
      },
      {  
         "_source":{  
            "data":{  
               "status":{  
                  "transactions":[  
                     {  
                        "id":"234",
                        "documents":[  
                           {  
                              "count":true
                           },
                           {  
                              "count":true
                           }
                        ]
                     }
                  ]
               }
            }
         }
      },
      {  
         "_source":{  
            "data":{  
               "status":{  
                  "transactions":[  
                     {  
                        "id":"345",
                        "documents":[  
                           {  

                           },
                           {  
                              "count":true
                           }
                        ]
                     }
                  ]
               }
            }
         }
      }
   ]
}

输出:

{
  "docs": [
    {
      "doc": {
        "_id": "_id",
        "_index": "_index",
        "_type": "_type",
        "_source": {
          "data": {
            "status": {
              "transactions": [
                {
                  "documents": [
                    {
                      "count": true
                    },
                    {
                      "count": false
                    }
                  ],
                  "id": "123"
                }
              ]
            }
          },
          "stats": {
            "docCount": 1
          }
        },
        "_ingest": {
          "timestamp": "2018-11-14T13:46:29.963Z"
        }
      }
    },
    {
      "doc": {
        "_id": "_id",
        "_index": "_index",
        "_type": "_type",
        "_source": {
          "data": {
            "status": {
              "transactions": [
                {
                  "documents": [
                    {
                      "count": true
                    },
                    {
                      "count": true
                    }
                  ],
                  "id": "234"
                }
              ]
            }
          },
          "stats": {
            "docCount": 2
          }
        },
        "_ingest": {
          "timestamp": "2018-11-14T13:46:29.963Z"
        }
      }
    },
    {
      "doc": {
        "_id": "_id",
        "_index": "_index",
        "_type": "_type",
        "_source": {
          "data": {
            "status": {
              "transactions": [
                {
                  "documents": [
                    {},
                    {
                      "count": true
                    }
                  ],
                  "id": "345"
                }
              ]
            }
          },
          "stats": {
            "docCount": 1
          }
        },
        "_ingest": {
          "timestamp": "2018-11-14T13:46:29.963Z"
        }
      }
    }
  ]
}