查找希伯来语名称

时间:2017-10-01 17:39:30

标签: sql regex postgresql performance hebrew

我有一个带有users表的postgresql数据库,其中每个用户都有一个名字(在unicode中)。我想找到名字中包含至少一个希伯来字符的所有用户。我曾想过使用regex,例如

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

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

更新

@FuzzyTree将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 个答案:

答案 0 :(得分:1)

一个选项是创建一个布尔列,即is_hebrew_name,您可以使用正则表达式更新一次并创建常规索引。

如果您不想添加其他列并且您正在运行v9.3或更高版本,请考虑使用pg_trgm模块创建GIN或{{1 GIST

上的索引
name
  

pg_trgm模块提供了GiST和GIN索引操作符类   允许您为文本列创建索引   非常快速的相似性搜索这些索引类型支持   上述相似度运算符,以及另外的支持   基于trigram的索引搜索LIKE,ILIKE,〜和〜*查询。

     

索引搜索的工作原理是从常规中提取三元组   表达式,然后在索引中查找这些。三卦越多   可以从正则表达式中提取,效果更好   索引搜索是。与基于B树的搜索不同,搜索字符串   不需要左撇子。

     

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

     

GiST和GIN索引之间的选择取决于相对值   讨论了GiST和GIN的性能特征   别处。

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