我有一个数据库,希望能够在表格中查找类似以下内容的搜索: 从表格中选择*,例如“abc%def%ghi” 要么 从表格中选择*,例如“%def%ghi” 有没有办法索引列,以便这不是太慢?
编辑: 我是否还可以澄清数据库是只读的,不会经常更新。
答案 0 :(得分:17)
文本搜索和索引的选项包括:
full-text indexing包含基于字典的搜索,包括对前缀搜索的支持,例如to_tsvector(mycol) @@ to_tsquery('search:*')
text_pattern_ops
indexes支持前缀字符串匹配,例如LIKE 'abc%'
但不中缀搜索,例如%blah%
;. reverse()
d索引可用于后缀搜索。
pg_tgrm
trigram indexes适用于较新版本as demonstrated in this recent dba.stackexchange.com post。
外部搜索和索引工具,如Apache Solr。
根据上面给出的最小信息,我会说只有一个三元组索引才能帮助你,因为你正在对一个字符串进行中缀搜索而不是查找字典单词。不幸的是,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_ops
或text_pattern_ops
create index test_index on test_table (col varchar_pattern_ops);
仅当模式不以%
开头时才会起作用,在这种情况下需要另一种策略。