SQL使用ilike模糊查询如何匹配含间隔特殊字符的文本
解决方案
方案1:使用正则匹配(适合小数据量,灵活度高)
你当前使用的ilike仅支持简单通配符匹配,要实现关键词之间允许穿插特殊字符的需求,可以改用PostgreSQL支持的不区分大小写正则匹配操作符~*,将词与词之间的固定空格替换为「任意数量非字母字符」的匹配规则即可。
示例SQL:
select * from db.table where text ~* 'driver[^a-zA-Z]*needs[^a-zA-Z]*car'
其中[^a-zA-Z]*表示匹配0个或多个非字母字符,包含空格、标点、特殊符号等,不管driver和needs之间是空格、逗号、冒号还是多个符号组合都能正常命中。
方案2:使用全文搜索(适合大数据量,性能更高)
如果表数据量较大,正则匹配的性能会比较差,可以用PostgreSQL内置的全文搜索能力,天生会忽略文本中的标点、特殊符号,只匹配关键词的内容和顺序:
示例SQL:
select * from db.table where to_tsvector('english', text) @@ phraseto_tsquery('english', 'driver needs car')
phraseto_tsquery会严格匹配关键词的先后顺序,自动忽略中间的所有特殊字符、多余空格,完全符合你的需求,你还可以给to_tsvector('english', text)建GIN索引大幅提升查询速度。
内容的提问来源于stack exchange,提问作者DrGenius
相关产品推荐
相关产品推荐

