如何在关系数据发生变化时更新PostgreSQL全文搜索字段



我在我的web应用程序中使用以下策略进行全文搜索,该应用程序使用PostgreSQL进行关系数据存储。例如,我将使用Invoices表。

  1. 在表中,我有一个额外的字段ALTER TABLE invoices ADD COLUMN tsv tsvector,全文搜索查询在其上完成,如... WHERE tsv @@ to_tsquery('query:*') ...

  2. 在每个全文搜索表上,我都设置了一个更新触发器,每次更改记录时都会更新tsv字段。更新设置并将不同字段的数据连接到tsv字段,设置正确的权重等。

  3. 设置到tsv字段中的数据也可以是来自其他表的关系数据。根据表invoices中的示例,我有client_id字段,但由于我也想按客户名称搜索发票,我还在invoices.tsv字段中包括clients.client_name数据

我的问题是,保持tsv选择器中关系数据同步的最佳策略是什么。在上面的场景中->如果客户名称更改,我需要在每个发票的tsv字段中更新此项。。。

我应该设置每天晚上都这样做的cron作业设置吗?它也可以用触发器来完成,但由于我的数据库架构非常大,我担心如果到处都有触发器,它可能会失控。

如果将客户端名称添加到tsv字段中,则最终会变得更加复杂。您可能需要研究本文中提到的Materialized视图。代价可能是显示结果的速度和定期刷新视图的需要。从Postgres9.4开始,您现在可以同时刷新视图。

您可以做的另一件事是在Client表中创建一个更新触发器,当有更新时,它也会更新Invoices表中的数据。

最新更新