【问题标题】:Is there a postgres fuzzy match faster than pg_trgm?是否有比 pg_trgm 更快的 postgres 模糊匹配?
【发布时间】:2010-11-02 00:04:12
【问题描述】:

我有一个包含大约 500 万条记录的 Postgres 表,我想找到与输入键最接近的匹配项。我尝试在 pg_trgm 模块中使用 trigram,但每次查询大约需要 5 秒,这对于我的需求来说太慢了。

有没有更快的方法在 Postgres 中进行模糊匹配?

【问题讨论】:

  • 键的结构是怎样的?字母数字?仅限整数?
  • 索引建立在文本类型的属性之上。
  • 请向我们展示您的查询“解释分析”的输出。
  • 解释分析 select * from fbsimple where lower(en) % 'france';查询计划------------------------------------------------ ---------- fbsimple 上的位图堆扫描 (cost=399.17..20762.45 rows=5600 width=898) (实际时间=2965.130..8722.165 rows=20 loops=1) Filter: (lower(en ) % 'france'::text) -> 位图索引扫描 lower_trgm_idx (cost=0.00..397.77 rows=5600 width=0) (实际时间=2404.114..2404.114 rows=43677 loops=1) Index Cond: (lower (en) % 'france'::text) 总运行时间:8741.179 毫秒(5 行)
  • 上述方案中提到的索引为:CREATE INDEX lower_trgm_idx ON fbsimple USING gin (lower(en) gin_trgm_ops);

标签: database postgresql indexing fuzzy-search


【解决方案1】:

您的解释输出中对结果大小的估计似乎有些偏差。这并不意外,因为很难很好地估计全文搜索的结果。

这会导致 Postgresql 使用错误的查询计划。尝试禁用位图扫描(设置 enable_bitmapscan=off),然后重试。

【讨论】:

    【解决方案2】:

    Soundex 是另一种模糊匹配,但它可以是非常模糊的。如果可以的话,我会坚持使用三元组匹配。您是否可以使用其他标准来使三元组搜索适用于较小的结果集?

    【讨论】:

      【解决方案3】:

      根据您要查找的内容,Postgres 还可以对正则表达式进行匹配,而不是标准的“like”语法。它可能更适合您。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-15
        • 2014-12-03
        • 2019-10-24
        相关资源
        最近更新 更多