elasticsearch 使用 logstash 和 csv 删除文档
elasticsearch delete documents using logstash and csv
有没有什么方法可以使用 Logstash 和 csv 文件从 ElasticSearch 中删除文档?
我阅读了 Logstash 文档但没有发现任何内容并尝试了一些配置但使用操作 "delete"
没有任何反应
output {
elasticsearch{
action => "delete"
host => "localhost"
index => "index_name"
document_id => "%{id}"
}
}
有人试过吗?有什么特别的我应该添加到配置的输入和过滤器部分吗?我使用文件插件作为输入,使用 csv 插件作为过滤器。
完全可以按照您的建议进行操作,但是如果您使用的是 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
您将能够删除所有其 ID 在您的 CSV 文件中指定的文档。
除了 Val 的回答之外,我还要补充一点,如果您有一个混合了已删除行和更新插入行的输入,并且您有一个标识要删除的行的标志,则可以同时执行这两种操作。 output > elasticsearch > action
参数可以是 "field reference,",这意味着您可以引用每行字段。更好的是,您可以将该字段更改为元数据字段,以便它可以在字段引用中使用而无需编制索引。
例如,在您的 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"
}
}
有没有什么方法可以使用 Logstash 和 csv 文件从 ElasticSearch 中删除文档? 我阅读了 Logstash 文档但没有发现任何内容并尝试了一些配置但使用操作 "delete"
没有任何反应output {
elasticsearch{
action => "delete"
host => "localhost"
index => "index_name"
document_id => "%{id}"
}
}
有人试过吗?有什么特别的我应该添加到配置的输入和过滤器部分吗?我使用文件插件作为输入,使用 csv 插件作为过滤器。
完全可以按照您的建议进行操作,但是如果您使用的是 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
您将能够删除所有其 ID 在您的 CSV 文件中指定的文档。
除了 Val 的回答之外,我还要补充一点,如果您有一个混合了已删除行和更新插入行的输入,并且您有一个标识要删除的行的标志,则可以同时执行这两种操作。 output > elasticsearch > action
参数可以是 "field reference,",这意味着您可以引用每行字段。更好的是,您可以将该字段更改为元数据字段,以便它可以在字段引用中使用而无需编制索引。
例如,在您的 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"
}
}