如何使用Logstash jdbc插件输入一对多关系的多表连接

ffvjumwh  于 11个月前  发布在  Logstash
关注(0)|答案(1)|浏览(154)

我有两个表链接在一对多的关系,即在第一个表中的每一行将在第二个表多行。一个员工可以有许多订单分配给他们。
型号:

我如何才能实现数据上传到弹性的一个单一的索引,有一个数组的形式的订单内的主要JSON源的索引?
请注意,我想纯粹用Logstash和Elastic来实现这一点,而不是在应用程序端处理这一点,或者在应用程序上使用单独的查询。



我还想补充的是,我已经阅读了关于弹性的自定义Map和模板,但我需要logstash的方式来推送我所展示的格式的数据。
谢谢你,谢谢
https://discuss.elastic.co/t/logstash-jdbc-plugin-input-for-mutliple-table-joins-of-one-to-many-relationships/59933

sigwle7e

sigwle7e1#

一种方法是执行一个查询,为多值字段orders生成JSON格式的输出。一个使用postgres的示例如下所示:
首先,你会有一个SQL查询文件employees-logstash.sql,内容如下:

WITH json_employee_orders as (
  select
    employee_id,
    JSON_AGG(JSON_BUILD_OBJECT('order_id', order_id, 'product_name', product_name) as orders
  from employee_orders
  group by employee_id
)

SELECT
  e.id, e.last_name, e.first_name, ...,
  jeo.orders::text as orders -- we use ::text because logstash doesn't recognize postgres native JSON type columns
FROM employee e
LEFT JOIN json_employee_orders jeo ON jeo.employee_id = e.id

字符串
然后你的logstash.conf会有这样的内容:

input {
  jdbc {
    jdbc_driver_library => "${PWD}/postgresql-42.6.0.jar"
    jdbc_driver_class => "org.postgresql.Driver"
    jdbc_connection_string => "jdbc:postgresql://${DATABASE_HOST}/${DATABASE_NAME}"
    jdbc_user => "${DATABASE_USER}"
    jdbc_password => "${DATABASE_PASSWORD}"
    statement_filepath => "${PWD}/employees-logstash.sql"
  }
}

filter {
  json {
    source => "orders"
    target => "orders"
  }
}

output {
  opensearch {
    hosts => ["${OPENSEARCH_URL}"]
    user => "${OPENSEARCH_USER}"
    password => "${OPENSEARCH_PASSWORD}"
    index => "employees"
    document_id => "%{[id]}"
  }
}

相关问题