PostgreSQL含特殊字符的实体名称高效搜索技术问询
PostgreSQL含特殊字符的实体名称高效搜索问题
我正在开发PostgreSQL数据库中的实体名称搜索功能,实体名称通常由1-3个单词组成,可能包含&、!、(、)、-等特殊符号。
目前使用gin trigram索引,通过WHERE name ILIKE '%something%'、ILIKE 'a%'以及WHERE name % 'abc'语句实现模糊搜索(当ILIKE精确匹配无结果时启用)。但存在问题:trigram索引会忽略特殊字符,无法支持含任意字符的搜索。
我尝试使用text_pattern_ops索引解决该问题,但效果不佳,例如WHERE name ILIKE '%$%'这类查询速度极慢。
请问是否存在高效处理此类查询的方法?是否需要采用全文搜索来实现需求?
更新1:表结构与示例查询
表结构如下:
| id (int) | Name (text) |
|---|---|
| 123 | Dolce&Gabbana |
示例查询:
SELECT name FROM brand WHERE name ILIKE '%&%' ORDER BY name;
更新2:执行计划与索引信息
查询执行计划语句:
EXPLAIN(analyze, verbose, buffers, settings) SELECT name FROM brand WHERE name ILIKE '%$%' ORDER BY name
执行计划截图:
已创建的索引:
CREATE INDEX brand_trgm_idx ON brand USING gin (name gin_trgm_ops);
表创建语句:
CREATE TABLE brand ( id serial PRIMARY KEY, name TEXT, collection_id TEXT, created_at TIMESTAMP DEFAULT now() NOT NULL, created_by TEXT NOT NULL );
也曾尝试创建以下索引:
CREATE INDEX brand_name_idx ON brand (name text_pattern_ops);
更新3:百万级数据查询分析
在包含约100万条数据的同数据库中进行的查询分析截图:
内容的提问来源于stack exchange,提问作者Анастасия Разумовская
相关产品推荐
相关产品推荐

