0

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

4

1 回答 1

0

根据elasticsearch split document ingest processor的上一个问题,无法使用 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"
  }
}

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

于 2020-07-02T17:34:11.030 回答