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