Hi,
Been trying to use the aggregate filter to build nested objects. I think my config is correct but maybe I am running it wrong
This is my setup (Elasticsearch 5.6, Logstash 5.6, debian 9/stretch)
orders
id | name | amount | date |
---|---|---|---|
1 | Alpha | $100 | 2017-09-01 |
2 | Bravo | $200 | 2017-09-02 |
3 | Charlie | $300 | 2017-09-03 |
order_events
id | order_id | note | date |
---|---|---|---|
1 | 1 | Created for Alpha | 2017-09-01 |
2 | 1 | Paid by Alpha using Visa | 2017-09-01 |
3 | 1 | Shipped to Alpha (Alabama) | 2017-09-01 |
4 | 2 | Created for Bravo | 2017-09-02 |
5 | 2 | Paid by Bravo using Mastercard | 2017-09-02 |
6 | 2 | Shipped to Bravo (Boise, Idaho) | 2017-09-02 |
7 | 3 | Created by Charlie | 2017-09-03 |
8 | 3 | Paid by Charlie using Amex | 2017-09-03 |
9 | 3 | Shipped to Charlie (California) | 2017-09-03 |
I have 2 conf files as follows (creates an index called orders
)
// db_orders.conf
input {
jdbc {
jdbc_driver_library => "/home/vagrant/mysql-connector-java-5.1.44/mysql-connector-java-5.1.44-bin.jar"
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_connection_string => "jdbc:mysql://192.168.10.11:3306/example"
jdbc_user => "root"
jdbc_password => "password"
statement => "
SELECT
*
FROM
orders
"
jdbc_paging_enabled => "true"
jdbc_page_size => "50000"
}
}
output {
elasticsearch {
index => "orders"
document_type => "order"
document_id => "%{id}"
hosts => ["localhost"]
}
}
// db_order_events.conf
input {
jdbc {
jdbc_driver_library => "/home/vagrant/mysql-connector-java-5.1.44/mysql-connector-java-5.1.44-bin.jar"
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_connection_string => "jdbc:mysql://192.168.10.11:3306/example"
jdbc_user => "root"
jdbc_password => "password"
statement => "
SELECT
*
FROM
order_events
"
jdbc_paging_enabled => "true"
jdbc_page_size => "50000"
}
}
filter {
aggregate {
task_id => "%{order_id}"
code => "
map['order_id'] = event.get('order_id')
map['events'] ||= []
map['events'] << {
'id' => event.get('id'),
'order_id' => event.get('order_id'),
'note' => event.get('note')
}
"
push_previous_map_as_event => true
timeout => 3
}
}
output {
elasticsearch {
index => "orders"
document_type => "order"
document_id => "%{id}"
hosts => ["localhost"]
}
}
and I run them separately <= maybe this is the problem ???
sudo -Hu logstash /usr/share/logstash/bin/logstash --path.settings=/etc/logstash -f /etc/logstash/conf.d/db_orders.conf
sudo -Hu logstash /usr/share/logstash/bin/logstash --path.settings=/etc/logstash -f /etc/logstash/conf.d/db_order_events.conf
This is mostly based on following "Example #4" on the documentation
I have tried doing different variations inside the filter yml section with no luck
Doing a search
http://192.168.10.14:9200/orders/_search?q=Alpha&pretty&pretty
shows my only a "flat" object without the nested notes
{
"took" : 17,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 1,
"max_score" : 0.6173066,
"hits" : [
{
"_index" : "orders",
"_type" : "order",
"_id" : "1",
"_score" : 0.6173066,
"_source" : {
"date" : "2017-09-01",
"name" : "Alpha",
"id" : "1",
}
]
}
}
I was expecting it to do something like
...
{
"_index" : "orders",
"_type" : "order",
"_id" : "1",
"_score" : 0.6173066,
"_source" : {
"date" : "2017-09-01",
"name" : "Alpha",
"id" : "1",
"events": [
{ ... "note": "Created for Alpha" },
{ ... "note": "Paid by Alpha ... " },
{ ... "note": "Shipped to Alpha ... " },
]
}
...
so the following search will work
http://192.168.10.14:9200/orders/_search?q=Visa&pretty&pretty
and pull the same results above (instead of NO hits)
Am I missing something?
Thank you