elasticsearch使用logstash和csv删除文档

时间:2015-10-01 14:39:51

标签: csv elasticsearch logstash

有没有办法使用Logstash和csv文件从ElasticSearch中删除文档? 我阅读了Logstash文档但没有发现任何内容并尝试了一些配置,但没有发生任何事情使用操作"删除"

output {
    elasticsearch{
        action => "delete"
        host => "localhost"
        index => "index_name"
        document_id => "%{id}"
    }
} 

有人试过吗?我应该添加到配置的输入和过滤器部分有什么特别之处吗?我使用文件插件进行输入,使用csv插件进行过滤。

2 个答案:

答案 0 :(得分:1)

绝对可以按照您的建议进行操作,但如果您使用的是Logstash 1.5,则需要使用transport协议,因为在执行delete时,Logstash 1.5中存在错误HTTP协议(参见issue #195

因此,如果您的delete.csv CSV文件的格式如下:

id
12345
12346
12347

您的delete.conf Logstash配置如下所示:

input {
    file {
        path => "/path/to/your/delete.csv"
        start_position => "beginning"
        sincedb_path => "/dev/null"
    }
}
filter {
    csv {
        columns => ["id"]
    }
}
output {
    elasticsearch{
        action => "delete"
        host => "localhost"
        port => 9300                         <--- make sure you have this
        protocol => "transport"              <--- make sure you have this
        index => "your_index"                <--- replace this
        document_type => "your_doc_type"     <--- replace this
        document_id => "%{id}"
    }
}

然后在运行bin/logstash -f delete.conf时,您将能够删除在CSV文件中指定了其ID的所有文档。

答案 1 :(得分:0)

除了Val的答案之外,我还要补充一点,如果你有一个混合了删除行和插入行的单个输入,如果你有一个标识要删除的行的标志,你可以同时执行这两个操作。 output > elasticsearch > action参数可以是“字段引用”,这意味着您可以引用每行字段。更好的是,您可以将该字段更改为元数据字段,以便可以在字段引用中使用它而无需编制索引。

例如,在filter部分:

filter {
    # [deleted] is the name of your field
    if [deleted] {
        mutate {    
            add_field => {
                "[@metadata][elasticsearch_action]" => "delete"
            }
        }
        mutate {
            remove_field => [ "deleted" ]
        }
    } else {
        mutate {    
            add_field => {
                "[@metadata][elasticsearch_action]" => "index"
            }
        }
        mutate {
            remove_field => [ "deleted" ]
        }
    }   
}

然后,在输出部分中,引用元数据字段:

output {
    elasticsearch {
        hosts => "localhost:9200"
        index => "myindex"
        action => "%{[@metadata][elasticsearch_action]}"
        document_type => "mytype"
    }
}