elasticsearch logstash-通过转换映射到json数组,elasticsearch,logstash,elasticsearch,Logstash" /> elasticsearch logstash-通过转换映射到json数组,elasticsearch,logstash,elasticsearch,Logstash" />

elasticsearch logstash-通过转换映射到json数组

elasticsearch logstash-通过转换映射到json数组,elasticsearch,logstash,elasticsearch,Logstash,我有以下json文件,每一行都是不同的json: {"s":"some address","c":"some city"} {"s":"some address1","c":"some city1"} {"s":"some address2","c":"some cit

我有以下json文件,每一行都是不同的json:

{"s":"some address","c":"some city"}
{"s":"some address1","c":"some city1"}
{"s":"some address2","c":"some city2"}
我的工作如下:

input {
    file {
        start_position => "beginning"
        path => "/sources/someFile.txt"
    }
}

filter {
    json {
        source => "a"
        target => "addresses[0].street"
    }
    mutate {
        remove_field => ["message", "@timestamp", "host", "path", "@version"]
    }
}

output {
    elasticsearch {
        hosts => "http://elasticsearch:9200"
        index => "store"
    }
}
我希望按如下方式写入索引(每个地址作为数组中的forst元素转到不同的文档):

附加的作业不工作。没有错误,什么都不做。

谢谢

您不能在json过滤器的目标选项中使用该字段引用。在过去几年的logstash的任何版本中,我都希望这会导致一个jsonparsefailure标记和错误

Exception caught in json filter {:exception=>"Invalid FieldReference: `addresses[0].street`"
如果将引用更改为[addresses][0],则它将正常运行,但该引用将被解释为“addresses”散列中的“0”项,而不是addresses数组中的第一个项

传入的JSON具有错误的字段名,因此必须重命名字段。我认为在ruby过滤器中实现它是最简单的

json { source => "message" target => "[@metadata][json]" }
ruby {
    code => '
        json = event.get("[@metadata][json]")
        event.set("addresses", [ { "street" => json["s"], "city" => json["c"] } ] )
    '
}
产生

 "addresses" => [
    [0] {
          "city" => "some city",
        "street" => "some address"
    }
],

原始JSON放在[@metadata]字段中,因此该字段可用,但不被输出索引。

谢谢。你能试着把它和我原来的剧本放在一起吗。我做不到。谢谢,我提供的json和ruby过滤器应该会取代您现有的json过滤器。文件输入将把文件行的文本放在字段[message]中,而不是[A]。如果您以前运行过logstash,它将记录它在sincedb中读取了多少输入文件,因此您需要在文件中附加新行以让logstash读取它们。
Exception caught in json filter {:exception=>"Invalid FieldReference: `addresses[0].street`"
json { source => "message" target => "[@metadata][json]" }
ruby {
    code => '
        json = event.get("[@metadata][json]")
        event.set("addresses", [ { "street" => json["s"], "city" => json["c"] } ] )
    '
}
 "addresses" => [
    [0] {
          "city" => "some city",
        "street" => "some address"
    }
],