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

时间:2018-11-14 13:08:34

标签: elasticsearch elasticsearch-painless

我正在尝试基于标志来计数JSON对象。 为此,我创建了两个遍历对象的foreach管道。

我要计算documents字段设置为"count"的{​​{1}}数组中的所有对象。

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
                           }
                        ]
                     }
                  ]
               }
            }
         }
      }
   ]
}

foreach pipeline doc建议使用{ "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条目”?

1 个答案:

答案 0 :(得分:0)

我最终用轻松的脚本完成了整个过程。

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"
        }
      }
    }
  ]
}