将Postgres“材料化视图”刷新为ElasticSearch文档更新的源吗?

时间:2019-05-24 17:41:09

标签: postgresql amazon-web-services elasticsearch materialized-views

我有一个规范化的数据库,该数据库在AWS RDS Postgres数据库中有几个表,大约有一百万条记录。

我想编写一个实现视图,该视图将这些表中的几个表连接起来,以生成ElasticSearch文档的记录结构。

刷新物化视图时(我将使用并发选项),我希望将该活动作为插入或更新或删除操作推送到AWS ElasticSearch。

我只会修改基础表并每周刷新一次物化视图。

这项工作是否可以-具体化的物化视图刷新是否会在WAL中作为插入/更新/删除记录下来?

1 个答案:

答案 0 :(得分:0)

我正在我正在从事的项目中进行此操作,到目前为止一切正常,我将logstash用作独立应用程序,每次我想要更新数据时,我都会刷新物化视图并使用postgres驱动程序运行logstash (就我而言,我在服务器上有一份工作,每2个小时执行一次)。 为此,您需要运行命令行:     path/to/logstash/bin/logstash -f path/to/postgres2elasticsearch.conf

在文件“ postgres2elasticsearch.conf”中,您应该输入:

input {
    jdbc {
        jdbc_connection_string => "jdbc:postgresql://${RDS_HOSTNAME}:${RDS_PORT}/${RDS_DB_NAME}"
        jdbc_user => "${RDS_USERNAME}"
        jdbc_password => "${RDS_PASSWORD}"
        jdbc_driver_library => "${DRIVE_PATH}"
        jdbc_driver_class => "org.postgresql.Driver"
        statement => "SELECT * from ${MY_MATERIALIZED_VIEW} order by ${ID_FIELD}"
        jdbc_paging_enabled => true
    }
}
output {
    elasticsearch {
        index => "${ES_INDEX}"
        hosts => ["${ES_DATA_HOST}:443"]
    }
}

查询中的order by子句很重要,因为Logstash将分批插入数据,如果您不订购数据,则可能一部分数据重复而另一部分不重复完全不适合Elasticsearch,因此我建议您为此事在物化视图上有一个索引唯一字段。然后,您需要下载postgres jdbc driver并将其放在$ {DRIVE_PATH}