我有由表格组成的物业管理应用程序:
tenants
landlords
units
properties
vendors-contacts
基本上我想要一个搜索字段来搜索它们,而不是必须选择我正在搜索的类别。这是否是一个可接受的解决方案(明智的技术?)
从长远来看,搜索5个表是否可以,不会让服务器陷入困境?实现这一目标的最佳方法是什么?
使用PostgreSQL
答案 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全文索引将非常有用。
如果你想在数据库中实现这个,假设你使用代理键,可能会有类似下面的方案:
之后你可以这样进行搜索:
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)
你应该没事,并且没有其他好的(简单的)方法可以做到这一点。只需确保您正在搜索的字段已正确编入索引。