繁体   English   中英

使用 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
  }
}

使用无痛或其他方式的注入管道可以实现这一目标吗? (也许重新索引??)

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

根据elasticsearch 拆分文档摄取处理器上的上一个问题,无法使用 Elastic Search 的摄取节点拆分文档。

我使用Logstash及其拆分过滤器拆分packetbeat发送的文档,配置如下:

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

JSON 过滤器也可用于解析字符串化的 JSON:

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

然而,事实证明 memory 在不需要的地方运行 Logstash 非常密集,并且有时会因堆栈溢出而崩溃。 我选择使用 node.js,使用puppeteer和 chromium 而不是 packetbeat 来收集数据,并在 node.js 中处理解析和拆分,然后将其直接发送到 Elastic Search。 这适用于我的用例,其中捕获的数据是来自 web 页面的 AJAX 调用,但它可能不适合其他页面。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM