首页 > 解决方案 > Postgres“物化视图”刷新为 ElasticSearch 文档更新的来源?

问题描述

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

我想编写一个物化视图,将其中几个表连接起来,为 ElasticSearch 文档生成记录结构。

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

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

这会起作用吗 - 特别是物化视图的刷新会在 WAL 中记录为插入/更新/删除吗?

标签: postgresqlamazon-web-serviceselasticsearchmaterialized-views

解决方案


我在我正在从事的一个项目中这样做,到目前为止它运行良好,我将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 驱动程序并将其放在 ${DRIVE_PATH}


推荐阅读