【发布时间】:2021-12-07 01:59:00
【问题描述】:
我有一个数据库,并且希望能够在表中查找类似于以下内容的搜索: select * from table where column like "abc%def%ghi" 或者 select * from table where column like "%def%ghi" 有没有办法为列建立索引,这样就不会太慢?
编辑: 能否再澄清一下,数据库是只读的,不会经常更新。
【问题讨论】:
标签: postgresql
我有一个数据库,并且希望能够在表中查找类似于以下内容的搜索: select * from table where column like "abc%def%ghi" 或者 select * from table where column like "%def%ghi" 有没有办法为列建立索引,这样就不会太慢?
编辑: 能否再澄清一下,数据库是只读的,不会经常更新。
【问题讨论】:
标签: postgresql
文本搜索和索引选项包括:
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这样的外部搜索和索引工具。
根据上面给出的最少信息,我想说只有三元组索引才能为您提供帮助,因为您正在对字符串进行中缀搜索而不是查找字典单词。不幸的是,三元组索引巨大而且相当低效。不要指望某种神奇的性能提升,请记住,它们需要大量工作才能构建数据库引擎并保持最新状态。
【讨论】:
例如,如果您只需要获取整个表中的唯一子字符串,则可以创建子字符串索引:
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
【讨论】:
对于like 运算符,请使用运算符类varchar_pattern_ops 或text_pattern_ops 之一
create index test_index on test_table (col varchar_pattern_ops);
仅当模式不以 % 开头时才有效,在这种情况下需要另一种策略。
【讨论】: