使用 Elastic Search,我如何将包含数组的文档索引到多个文档中,每个数组项一个?

With Elastic Search, how can I index a document containing an array into multiple documents, one per array item?

假设我有一个 JSON 文档(在本例中是从 packetbeat 发送的)包含如下结构:

{
  "source": "http://some/url/",
  "items": [
    {"name":"item1", "value":1},
    {"name":"item2", "value":2}
  ]
}

如何让 Elastic Search 将这些作为单独的文档编制索引,以便我可以像这样检索它们:

GET http://elasicsearch:9200/indexname/doc/item1
{
  "source": "http://some/url/",
  "item": {
     "name":"item1", 
     "value":1
  }
}
GET http://elasicsearch:9200/indexname/doc/item2
{
  "source": "http://some/url/",
  "item": {
     "name":"item2", 
     "value":2
  }
}

injest pipeline 可以使用无痛或其他方法实现这一目标吗? (也许重新索引??)

(数据来自 Packetbeat,这对于涉及的大量数据是有效的,并且由类似项目的数组组成,比上面的示例更复杂。我没有使用 Logstash,而是宁愿为简单起见避免使用它,但如果有必要,我可以添加它。显然,我可以在发送文档之前使用编程语言拆分文档,但如果可能的话,我想在 Elastic Stack 中执行此操作,以最大程度地减少额外的依赖性。)

根据上一个问题elasticsearch split document ingest processor, it isn't possible to split documents using Elastic Search's ingest node

我得到了 packetbeat to work using Logstash and its split filter 发送的文件的拆分,配置如下:

input {
  beats {
    port => "5044"
  }
}
filter {
  split {
    field => "[body][requests]"
    target =>  "[body][requests]"
  }
}
output {
  stdout { codec => rubydebug }
}

JSON filter 也可用于解析字符串化 JSON:

filter {
  json {
    source => "_body"
    target => "_body"
  }
}

然而,事实证明,运行 Logstash 在不需要它的地方会占用大量内存,有时它会因堆栈溢出而崩溃。我选择使用 node.js,使用 puppeteer and chromium to harvest the data instead of packetbeat, and handled the parsing and splitting with in node.js before sending it directly 进行 Elastic Search。这适用于我的用例,其中捕获的数据是来自网页的 AJAX 调用,但它可能不适合其他情况。