代码之家  ›  专栏  ›  技术社区  ›  dimid

查找所有希伯来语名称的记录

  •  2
  • dimid  · 技术社区  · 7 年前

    regex ,例如。

    select * from users
    where name ~ '[א-ת]';
    

    有比正则表达式更有效的方法吗?我在“名称”列上有一个B树索引。

    使现代化

    pg_trgm suggested

          B-tree GIST  GIN
    user  0.04   0.04  0.03
    sys   0.02   0.04  0.01
    total 0.06   0.08  0.04
    

    关于磁盘大小,GIN索引是GIST索引的0.2倍,是B树的0.8倍。所以,至少在我的用例中,我们有一个胜利者。YMMV(例如,我尚未对索引创建和更新进行基准测试)。版本:postgres 9.6。

    1 回复  |  直到 7 年前
        1
  •  1
  •   dimid    7 年前

    一种选择是创建布尔列,即。 is_hebrew_name

    如果您不想添加其他列,并且正在运行v9.3或更高版本,那么可以考虑使用 pg_trgm GIN GIST 索引打开 name

    CREATE EXTENSION pg_trgm;
    CREATE INDEX trgm_idx ON users USING GIST (name gist_trgm_ops);
    

    pg_trgm模块提供GiST和GIN索引运算符类,用于 允许您在文本列上创建索引,以便 上述相似性算子,并额外支持 基于三角图的索引搜索LIKE、ILIKE、~和~*查询。

    表达式,然后在索引中查找这些。更多的三角图 那可以从正则表达式中提取,更有效 索引搜索为。与基于B树的搜索不同,搜索字符串

    对于LIKE和正则表达式搜索,请记住 没有可提取三角图的模式将退化为完整索引 扫描

    讨论了GiST和GIN的性能特点 在别处

    有关更多信息,请参阅 https://www.postgresql.org/docs/9.6/static/pgtrgm.html