我想合并来自不同数据库中两个不同表的信息。 在数据库db_a的表t_a中,我具有有关用户的信息,例如用户名,名称,电话号码等。 在数据库db_b的表t_b中,我具有有关用户的特定于系统的信息。例如,对于该系统,用户X的类型为Y.表t_b在表t_a上具有指示用户ID的字段,这就是我可以链接两个表的方式。 我想按Elastic中的用户名对用户进行分组,并且在每个文档中,将有一系列用户,这些用户针对具有该用户名的每个现有用户具有特定的用户信息。 例如
{
"_index" : "users",
...
"source" : {
"user_id" : "sysadmin",
"username" : "sysadmin"
"users": {
{
"name" : null, \\ From t_a
"email" : "fabio.lp@abcd.com", \\ From t_a
"tenantid" : "e118af1f-6674-4348-bb12-xxxxxxxx27a6", \\ From t_a
"user_type" : 1050 \\ From t_b
},
{
"name" : "Administrator", \\ From t_a
"email" : "joao.lapa@abcd.com", \\ From t_a
"tenantid" : "e118af1f-6674-4348-bb12-9032bd2xxxxx", \\ From t_a
"user_type" : 1050 \\ From t_b
}
}
}
}
这是我目前正在尝试做的事情。不幸的是无法正常工作:
input {
jdbc {
jdbc_connection_string => "jdbc:sqlserver://db_a;databaseName=t_a;user=xx;password=xxx;"
jdbc_driver_class => "com.microsoft.sqlserver.jdbc.SQLServerDriver"
jdbc_user => "xx"
jdbc_password => "xxx"
statement => "SELECT * FROM Users order by username"
}
}
filter {
jdbc_streaming {
jdbc_connection_string => "jdbc:sqlserver://db_b;databaseName=t_b;user=bbb;password=aaa;"
jdbc_driver_class => "com.microsoft.sqlserver.jdbc.SQLServerDriver"
jdbc_user => "aaa"
jdbc_password => "bbb"
statement => "select ExternalID, UserTypeID from [User] where ExternalID = :userid"
parameters => { "userid" => "id" }
target => "extra"
add_field => {
"userType" => "%{[extra][0][UserTypeID]}"
}
remove_field => ["extra"]
}
aggregate {
task_id => "%{username}"
code => "
map['username'] = event.get('username')
map['users'] ||= [ ]
map['users'] << {'name' => event.get('name'),
'email' => event.get('email'),
'tenantid' => event.get('tenantid')}
event.cancel()
"
push_previous_map_as_event => true
timeout_task_id_field => "user_id"
timeout => 3600
inactivity_timeout => 300
timeout_tags => ['_aggregatetimeout']
}
}
output {
elasticsearch {
hosts => ["localhost:9200"]
index => "users"
}
}
我试图解释我所能做到的最好= / 我想知道这是否可行,如何实现。