搜索多个表(最佳实践)

时间:2009-06-29 16:36:05

标签: python sql mysql postgresql pylons

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

tenants
landlords
units
properties
vendors-contacts

基本上我想要一个搜索字段来搜索它们,而不是必须选择我正在搜索的类别。这是否是一个可接受的解决方案(明智的技术?)

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

使用PostgreSQL

4 个答案:

答案 0 :(得分:7)

为什么不创建一个视图,这是一个表的联合,它将您要搜索的列聚合为一个,然后搜索该聚合列?

你可以这样做:

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进行过滤,这可能会更好,因为它在计算上会更便宜(并且可以优化得更好。)

答案 1 :(得分:4)

您想使用the built-in full text search或单独的产品,例如Lucene。这针对异构数据的非结构化搜索进行了优化。

另外,不要忘记普通索引不能用于something LIKE '%...%'。使用全文搜索引擎也可以进行有效的子字符串搜索。

答案 2 :(得分:3)

我建议使用像Lucene这样的专业全文索引工具。它可能更容易启动和运行,结果也更快,更有特色。如果您还需要结构化搜索功能或搜索索引的事务性很重要,Postgres全文索引将非常有用。

如果你想在数据库中实现这个,假设你使用代理键,可能会有类似下面的方案:

  1. 为每个可搜索表创建一个视图,该视图具有该表的主键列,表的名称以及该表中所有可搜索字段的串联。
  2. 在底层上通过完全相同的连接的to_tsvector()创建一个功能性GIN或GiST索引。
  3. 在所有视图上创建UNION ALL以创建可搜索的视图。
  4. 之后你可以这样进行搜索:

    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;
    

答案 3 :(得分:1)

你应该没事,并且没有其他好的(简单的)方法可以做到这一点。只需确保您正在搜索的字段已正确编入索引。