【问题标题】:Is there a way to index in postgres for fast substring searches有没有办法在 postgres 中为快速子字符串搜索建立索引
【发布时间】:2021-12-07 01:59:00
【问题描述】:

我有一个数据库,并且希望能够在表中查找类似于以下内容的搜索: select * from table where column like "abc%def%ghi" 或者 select * from table where column like "%def%ghi" 有没有办法为列建立索引,这样就不会太慢?

编辑: 能否再澄清一下,数据库是只读的,不会经常更新。

【问题讨论】:

    标签: postgresql


    【解决方案1】:

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

    根据上面给出的最少信息,我想说只有三元组索引才能为您提供帮助,因为您正在对字符串进行中缀搜索而不是查找字典单词。不幸的是,三元组索引巨大而且相当低效。不要指望某种神奇的性能提升,请记住,它们需要大量工作才能构建数据库引擎并保持最新状态。

    【讨论】:

    • “reverse()d index”指的是建立在表达式上的索引,在这种情况下为“reverse(col)”。我没有意识到这是可能的。这种机制的另一个用例是通过索引“lower(col)”进行不区分大小写的搜索。
    【解决方案2】:

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

    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

    【讨论】:

      【解决方案3】:

      对于like 运算符,请使用运算符类varchar_pattern_opstext_pattern_ops 之一

      create index test_index on test_table (col varchar_pattern_ops);
      

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

      【讨论】:

      • 如果需要全文搜索,pg_trgm 可能会起作用。我过去使用过它,它在某些条件下工作得很好。应该注意的是,索引变得相当大。 IIRC,大约是索引列大小的 2.5 倍。
      猜你喜欢
      • 2011-10-13
      • 2018-04-17
      • 1970-01-01
      • 2013-01-20
      • 2010-12-18
      • 2016-07-20
      • 2013-01-06
      • 1970-01-01
      相关资源
      最近更新 更多