如何使用无痛脚本获取 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"
}
}
}
]
}
我正在尝试根据标志计算 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"
}
}
}
]
}