小编Abd*_*gui的帖子

postgres 上的单词匹配的正则表达式性能较差

我有一个被阻止的短语列表,我想匹配用户输入的文本中是否存在这些短语,但性能非常糟糕。

我正在使用这个查询:

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)

与第一个相比,它非常快。问题是我需要保留单词边界的测试。

此检查在大型程序中频繁执行,因此性能对我来说非常重要。

你们有什么建议可以让这个更快吗?

解释分析屏幕截图

regex sql postgresql postgresql-9.3

3
推荐指数
1
解决办法
1083
查看次数

标签 统计

postgresql ×1

postgresql-9.3 ×1

regex ×1

sql ×1