在Postgres中以白色空格分隔的字符串查找

时间:2014-03-24 14:49:06

标签: postgresql database-design indexing pattern-matching postgresql-performance

我在postgres中有一个character varying字段,其中包含一组1个以空格分隔的字符串。 E.g:

  • --> one two three <--
  • --> apples bananas pears <--

我放--><--来显示字符串的开始和结束位置(它们不是存储字符串本身的一部分)

我需要查询此字段以查明整个字符串是否包含某个单词(例如apple)。可能的查询是

SELECT * FROM table WHERE thefield LIKE '%apple%'

但它很糟糕并且不会缩放,因为如果模式附加到字符串的开头,b-tree索引只会缩放,而在我的情况下,搜索的字符串可以位于字段中的任何位置。

您如何建议解决问题?

1 个答案:

答案 0 :(得分:3)

首先考虑database-normalization

在使用当前设计时,使用trigram index支持查询,这将非常快。

这个密切相关答案的更多细节和链接:
PostgreSQL LIKE query performance variations

关于dba.SE的相关答案中的模式匹配和索引更多:
Pattern matching with LIKE, SIMILAR TO or regular expressions in PostgreSQL