我在我的web应用程序中使用以下策略进行全文搜索,该应用程序使用PostgreSQL进行关系数据存储。例如,我将使用Invoices
表。
-
在表中,我有一个额外的字段
ALTER TABLE invoices ADD COLUMN tsv tsvector
,全文搜索查询在其上完成,如... WHERE tsv @@ to_tsquery('query:*') ...
-
在每个全文搜索表上,我都设置了一个更新触发器,每次更改记录时都会更新
tsv
字段。更新设置并将不同字段的数据连接到tsv
字段,设置正确的权重等。 -
设置到
tsv
字段中的数据也可以是来自其他表的关系数据。根据表invoices
中的示例,我有client_id
字段,但由于我也想按客户名称搜索发票,我还在invoices.tsv
字段中包括clients.client_name
数据
我的问题是,保持tsv选择器中关系数据同步的最佳策略是什么。在上面的场景中->如果客户名称更改,我需要在每个发票的tsv
字段中更新此项。。。
我应该设置每天晚上都这样做的cron作业设置吗?它也可以用触发器来完成,但由于我的数据库架构非常大,我担心如果到处都有触发器,它可能会失控。
如果将客户端名称添加到tsv字段中,则最终会变得更加复杂。您可能需要研究本文中提到的Materialized视图。代价可能是显示结果的速度和定期刷新视图的需要。从Postgres9.4开始,您现在可以同时刷新视图。
您可以做的另一件事是在Client表中创建一个更新触发器,当有更新时,它也会更新Invoices表中的数据。