精确匹配和 ILIKE 搜索的索引类型

Index Types for Exact Match and ILIKE Search

(Postgres 12)

我正在实施允许精确匹配和模糊 (ILIKE) 匹配的文本搜索:

attributes->>'ID' = 'some-id'
-- OR
attributes->>'ID' ILIKE '%some-%'

(用户声明搜索是否精确,因此查询中只会包含以上其中一项)

我正在为最常搜索的属性 ID 和名称建立索引。当我使用带有 gin_trgm_ops 的 GIN 时,模糊匹配要快得多。有了BTREE索引,精确匹配就快多了。

我可以同时拥有 BTREE 和 GIN 索引,但我想知道这是否绝对必要。有没有办法让 postgres 使用 GIN 索引进行精确匹配搜索?

从 v14 开始,pg_trgm 将自动处理相等性。它不会像 btree 索引那样高效,但它可能足够好,因此不值得同时拥有两个索引。

在那之前,最好的解决方案可能是只使用 LIKE 而不在搜索词的前后添加 % (实际上,转义搜索词中恰好存在的任何 % 或 _)当你想要完全匹配。