[英]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.