我有由表组成的物业管理应用程序:

tenants
landlords
units
properties
vendors-contacts

基本上,我希望一个搜索字段可以搜索所有内容,而不必选择我要搜索的类别。这是一个可以接受的解决方案(技术方面吗?)

从长远来看,跨 5 个表进行搜索是否可以,并且不会使服务器陷入困境?实现这一目标的最佳方法是什么?

使用 PostgreSQL

有帮助吗?

解决方案

我建议为此使用专门的全文索引工具,例如 Lucene。它可能会更容易启动和运行,而且结果也更快、功能更丰富。如果您还需要结构化搜索功能,或者搜索索引的事务性很重要,则 Postgres 全文索引将非常有用。

如果您确实想在数据库中实现这一点,假设您使用代理键,类似以下方案的方法可能会起作用:

  1. 为每个可搜索表创建一个视图,其中包含该表的主键列、表名称以及该表中所有可搜索字段的串联。
  2. 在完全相同的串联的 to_tsvector() 基础上创建功能性 GIN 或 GiST 索引。
  3. 在所有视图上创建 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过滤器,因为这将是计算上更便宜的(和可被更好地优化)。

您想使用内置全文搜索或一个单独的产品如 Lucene的。这是用于在不同种类的数据非结构化搜索优化。

另外,不要忘记,正常索引不能被用于something LIKE '%...%'。使用全文搜索引擎也能做到有效的字符串搜索。

您应该罚款,而且也确实没有其他的好(容易)的方式来做到这一点。只要确保您正在搜索的区域都正确,虽然索引。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top