hpo*_*dar 5 postgresql full-text-search multi-tenant
我有一个 PostgreSQL 数据库,用于存储多个用户帐户的联系信息表(名字、姓氏)。每个联系人行都有一个用户 ID 列。设置索引以便用户可以搜索联系人名字或姓氏的前几个字母的最有效方法是什么?
我知道传统的 b 树索引和 PG 特定的 GIN 和 GiST,但我只是不确定它们如何(或不能)一起工作,这样只有几个联系人的用户就不必搜索按 user_id 过滤之前的所有联系人。
您应该将帐户标识符添加为您创建的任何索引的第一列。这实际上首先将搜索范围缩小到属于该帐户的行。对于 gist 或 gin 全文索引,您需要安装 btree_gist 或 btree_gin 扩展。
如果您只需要搜索第一个字母,最简单且可能最快的方法是使用支持两列文本操作的常规 btree 并执行 2 次查找。您需要使用 text_pattern_ops ops 来支持文本前缀查询和 lower() 字段以确保不区分大小写:
CREATE INDEX contacts_firstname_idx ON contacts(aid, lower(firstname) text_pattern_ops);
CREATE INDEX contacts_lastname_idx ON contacts(aid, lower(lastname) text_pattern_ops);
Run Code Online (Sandbox Code Playgroud)
查询将如下所示:
SELECT * FROM contacts WHERE aid = 123 AND
(lower(firstname) LIKE 'an%' OR lower(lastname) LIKE 'an%')
Run Code Online (Sandbox Code Playgroud)