有没有办法在postgres中为快速子字符串搜索编制索引

时间:2013-07-13 19:10:09

标签: postgresql

我有一个数据库,希望能够在表格中查找类似以下内容的搜索: 从表格中选择*,例如“abc%def%ghi” 要么 从表格中选择*,例如“%def%ghi” 有没有办法索引列,以便这不是太慢?

编辑: 我是否还可以澄清数据库是只读的,不会经常更新。

3 个答案:

答案 0 :(得分:17)

文本搜索和索引的选项包括:

根据上面给出的最小信息,我会说只有一个三元组索引才能帮助你,因为你正在对一个字符串进行中缀搜索而不是查找字典单词。不幸的是,trigram索引巨大并且相当低效;不要指望某种神奇的性能提升,并记住他们需要花费大量的工作来建立数据库引擎并保持最新。

答案 1 :(得分:6)

例如,如果您只需要在整个表中获取唯一的子字符串,则可以创建子字符串索引:

CREATE INDEX  i_test_sbstr ON tablename (substring(columname, 5, 3)); 
-- start at position 5, go for 3 characters

It is important that the substring() parameters in the index definition are
the same as you use in your query.

参考:http://www.postgresql.org/message-id/BANLkTinjUhGMc985QhDHKunHadM0MsGhjg@mail.gmail.com

答案 2 :(得分:3)

对于like运算符,请使用其中一个运算符类varchar_pattern_opstext_pattern_ops

create index test_index on test_table (col varchar_pattern_ops);

仅当模式不以%开头时才会起作用,在这种情况下需要另一种策略。