跨多个表搜索(最佳实践)
-
21-08-2019 - |
题
我有由表组成的物业管理应用程序:
tenants
landlords
units
properties
vendors-contacts
基本上,我希望一个搜索字段可以搜索所有内容,而不必选择我要搜索的类别。这是一个可以接受的解决方案(技术方面吗?)
从长远来看,跨 5 个表进行搜索是否可以,并且不会使服务器陷入困境?实现这一目标的最佳方法是什么?
使用 PostgreSQL
解决方案
我建议为此使用专门的全文索引工具,例如 Lucene。它可能会更容易启动和运行,而且结果也更快、功能更丰富。如果您还需要结构化搜索功能,或者搜索索引的事务性很重要,则 Postgres 全文索引将非常有用。
如果您确实想在数据库中实现这一点,假设您使用代理键,类似以下方案的方法可能会起作用:
- 为每个可搜索表创建一个视图,其中包含该表的主键列、表名称以及该表中所有可搜索字段的串联。
- 在完全相同的串联的 to_tsvector() 基础上创建功能性 GIN 或 GiST 索引。
- 在所有视图上创建 UNION ALL 以创建可搜索视图。
之后您可以像这样进行搜索:
SELECT id, table_name, ts_rank_cd(body, query) AS rank
FROM search_view, to_tsquery('search&words') query
WHERE query @@ body
ORDER BY rank DESC
LIMIT 10;
其他提示
为什么不创建一个视图这是一个聚集你想搜索到上一个,然后在该集合列搜索列的表的联合?
您可以做这样的事情:
select 'tenants:' + ltrim(str(t.Id)), <shared fields> from Tenants as t union
select 'landlords:' + ltrim(str(l.Id)), <shared fields> from Tenants as l union
...
这需要一些逻辑来从客户端查询嵌入;它必须知道如何制造的关键,它的寻找,以对的单的字段进行搜索。
这是说,它可能会更好,如果你只是有一个单独的列其中包含一个“类型”值(例如业主,租客),然后在两个类型和ID过滤器,因为这将是计算上更便宜的(和可被更好地优化)。
您应该罚款,而且也确实没有其他的好(容易)的方式来做到这一点。只要确保您正在搜索的区域都正确,虽然索引。
不隶属于 StackOverflow