【问题标题】:With Elastic Search, how can I index a document containing an array into multiple documents, one per array item?使用 Elastic Search,我如何将包含数组的文档索引到多个文档中,每个数组项一个?
【发布时间】:2020-06-30 14:53:59
【问题描述】:

假设我有一个 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 中执行此操作,以最大限度地减少额外的依赖关系。)

【问题讨论】:

  • 我很好奇,您介意解释一下来自 packetbeat 的哪种数据(即哪种协议)创建这些数据数组吗?
  • 这是 HTTP 数据。响应的主体是一个 JSON 文档。在这种情况下,我有一个包含 JSON 数组的正文的 HTTP 请求,并且我希望该数组中的每个项目都有一个弹性搜索文档。
  • 这可能与stackoverflow.com/questions/53145978/…的问题重复

标签: elasticsearch elasticsearch-painless packetbeat


【解决方案1】:

根据elasticsearch split document ingest processor 的上一个问题,无法使用 Elastic Search 的ingest node 拆分文档。

我将packetbeat 发送的文档拆分为使用Logstash 及其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 和 chromium 而不是 packetbeat 来收集数据,并在 node.js 中处理解析和拆分,然后将 directly 发送到 Elastic Search。这适用于我的用例,其中捕获的数据是来自网页的 AJAX 调用,但它可能不适合其他人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-19
    • 1970-01-01
    • 1970-01-01
    • 2017-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-20
    相关资源
    最近更新 更多