【问题标题】:Find all records with Hebrew names查找所有带有希伯来名字的记录
【发布时间】:2017-10-01 17:39:29
【问题描述】:

我有一个带有 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-tree 的 0.8 倍。所以,我们在这里有一个赢家,至少对于我的用例而言。 YMMV(例如,我没有对索引创建和更新进行基准测试)。版本:postgres 9.6。

【问题讨论】:

  • 来吧,超过 2k 的代表,你应该已经是我们想要的,当你提供一些代码 sn-ps 时,你可能会得到更有用的答案。
  • @Jan,sn-p 干什么用的?我问的是 what 做什么,而不是 how 做什么。如果有帮助,我可以为我当前的正则表达式代码添加一个 sn-p。

标签: sql regex postgresql performance hebrew


【解决方案1】:

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

如果您不想添加其他列并且正在运行 v9.3 或更高版本,请考虑使用 pg_trgm 模块在 name 上创建 GINGIST 索引

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

pg_trgm 模块提供 GiST 和 GIN 索引运算符类 允许您为文本列创建索引 非常快速的相似性搜索。这些索引类型支持 上述相似性算子,另外还支持 基于三元组的索引搜索 LIKE、ILIKE、~ 和 ~* 查询。

索引搜索通过从常规中提取三元组来工作 表达式,然后在索引中查找这些。更多的三字 可以从正则表达式中提取,越有效 索引搜索是。与基于 B-tree 的搜索不同,搜索字符串 不需要左锚。

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

GiST 和 GIN 索引之间的选择取决于相对 讨论了 GiST 和 GIN 的性能特征 其他地方。

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

【讨论】:

  • 谢谢,我会test 并报告结果。
猜你喜欢
  • 1970-01-01
  • 2012-02-03
  • 2014-12-14
  • 2018-01-24
  • 1970-01-01
  • 2014-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多