Postgres "Materialized View" 刷新为 ElasticSearch 文档更新的来源?

Postgres "Materialized View" refresh as source of ElasticSearch document updates?

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

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

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

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

这行得通吗 - 特别是物化视图的刷新是否会在 WAL 中记录为 insert/update/deletes?

我在一个我正在做的项目中这样做,到目前为止它运行良好,我使用 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}