Я пытаюсь разобрать и отправить имена полей в ElasticSearch, и у меня возникла проблема с построением правильных полей.
Вот пример XML
<products>
<product name = "name_1"></product>
<product name = "name_2"></product>
<product name = "name_3"></product>
</products>
Мой файл конфигурации logstash:
input {
file {
path => "sample.xml"
start_position => "beginning"
sincedb_path => "/dev/null"
exclude => "*.gz"
type => "xml"
codec => multiline {
pattern => "<products>"
negate => "true"
what => "previous"
}
}
}
filter {
xml {
source => "message"
store_xml => false
target => "products"
add_field => {
"p_name" => "%{[products][product][name]}"
}
xpath => [
"/products/*/@name", "product_name"
]
}
}
В настоящее время в ElasticSearch: один p_name установлен на %{[products][product][name]}, а product_name - на name_1, name_2, name_3.
Вместо этого я хотел бы иметь 3 разные записи, каждая из которых имеет свой уникальный product_name.
Что такое правильный xml-фильтр?





Оказывается, проблема (скорее, то, что я думал, что я проглатывала) началась с неправильного чтения ввода. Ниже мой файл logstash.config.
Вместо того, чтобы использовать атрибут <products>, я перешел непосредственно к атрибуту <product>. Это означало, что каждая входящая линия была отдельным продуктом (и его подэлементами).
input {
file {
path => /file/example*.xml"
start_position => "beginning"
sincedb_path => "/dev/null"
type => "xml"
codec => multiline {
pattern => "<product>"
negate => "true"
what => "previous"
}
}
}
filter {
xml {
source => "message"
store_xml => false
xpath => [
"/product/@name", "name"
]
}
}
Я думаю, вы сможете сделать это с помощью разделенного фильтр, используя
p_nameв качестве параметра поля.