基于 PostgreSQL 的群聊搜索实践

背景 2021年年初,探探上线了群聊功能,并且支持按照群名进行模糊搜索。 对于复杂场景的搜索,业界一般使用非常流行的 ElasticSearch。由于我们的群数据较少,截止到目前还没有达到千万级的量级,且搜索场景比较简单,而 PostgreSQL 对全文搜索又支持得比较好,所以选择了 PostgreSQL 来实现群搜索需求。 在使用 PostgreSQL 做群搜索的过程中,也经历了由简单到复杂的迭代过程,中间也踩了不少坑。 下面的几个例子说明了方案的演进过程和我们的优化思路,希望能够对大家有所帮助。 LIKE 模糊查询 提到模糊搜索,最简单的办法就是对搜索列进行 like 匹配: 在输入词的前后加上 % 即可,如下所示: SELECT * FROM groups WHERE name LIKE '%探探%'; 这种方案可行是可行了,但是实现过于简单粗暴。对此方案进行测试: 建一张简单的表进行测试,表结构如下: lixuehan=# \d groups; Table "public.groups" Column | Type | Collation | Nullable | Default --------+-----------------------+-----------+----------+------------------------------------ id | bigint | | not null | nextval('groups_id_seq'::regclass) name | character varying(50) | | | Indexes: "groups_pkey" PRIMARY KEY, btree (id) 表中只有两列:主键 id 以及群名 name。...