我有一个被阻止的短语列表,我想匹配用户输入的文本中是否存在这些短语,但性能非常糟糕。
我正在使用这个查询:
SELECT value FROM blocked_items WHERE lower(unaccent( 'my input text' )) ~* ('[[:<:]]' || value || '[[:>:]]') LIMIT 1;
Run Code Online (Sandbox Code Playgroud)
经过我的调查,我发现世界边界[[:<:]]和[[:>:]]执行非常糟糕,因为知道blocked_items 有 24k 条记录。
例如,当我尝试运行这个时:
SELECT value FROM blocked_items WHERE lower(unaccent( 'my input text ' )) ilike ('%' || value || '%') LIMIT 1;
Run Code Online (Sandbox Code Playgroud)
与第一个相比,它非常快。问题是我需要保留单词边界的测试。
此检查在大型程序中频繁执行,因此性能对我来说非常重要。
你们有什么建议可以让这个更快吗?