簡體   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