问题标签 [pg-trgm]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
6183 浏览

postgresql - 优化 postgres 相似度查询(pg_trgm + gin index)

我定义了以下索引:

我正在执行以下查询:

auth_user表有 620 万行。

查询的速度似乎在很大程度上取决于查询可能返回的结果数量similarity

通过帮助增加相似性阈值set_limit,但通过消除部分匹配降低了结果的有用性。

有些搜索会在 200 毫秒内返回,有些则需要 10 秒左右。

我们有一个使用 Elasticsearch 的现有实现,该功能可以在 < 200 毫秒内返回任何查询,同时进行更复杂(更好)的排名。

我想知道是否有任何方法可以改进这一点以获得更一致的性能?

我的理解是 GIN 索引(倒排索引)与 Elasticsearch 使用的基本方法相同,所以我认为可以进行一些优化。

一个EXPLAIN ANALYZE EXECUTE user_search('mel', 20)节目:

服务器是在 Amazon RDS 上运行的 Postgres 9.6.1

更新

1.

发布问题后不久,我发现了以下信息:https ://www.postgresql.org/message-id/464F3C5D.2000700@enterprisedb.com

所以我尝试了

这取得了很大的进步(以前> 10s)!

对于类似的查询,1.5s 仍然比 ES 慢,所以我仍然想听听任何优化查询的建议。

2.

作为对评论的回应,并在看到这个问题(Postgresql GIN 索引比 pg_trgm 的 GIST 慢)后,我尝试了完全相同的设置,使用 GIST 索引代替 GIN 索引。

尝试与上面相同的搜索,它在 ~3.5 秒内返回,使用 default work_mem='4MB'。增加work_mem没有区别。

由此我得出结论,GIST 索引的内存效率更高(没有像 GIN 那样遇到病理情况),但是当 GIN 正常工作时比 GIN 慢。这与推荐 GIN 索引的文档中的描述一致。

3.

我仍然不明白为什么要花这么多时间在:

我不明白为什么需要此步骤或它在做什么。

Bitmap Index Scan每个username % $1子句都有下面的三个……然后将这些结果与一个BitmapOr步骤结合起来。这些部分都非常快。

但即使在我们没有用完工作内存的情况下,我们仍然在Bitmap Heap Scan.

0 投票
0 回答
483 浏览

postgresql - 使用 pg_trgm 进行正则表达式模式匹配(三元组匹配)

我在 postgresql 中有一个名为 mydata 的数据库,其中包含一个名为 text 的字段。我有兴趣进行正则表达式模式匹配,只返回匹配的片段,而不是整个文本。我知道您可以使用 pg_trgm(创建三元组匹配索引)来加快搜索速度,但是有没有办法将搜索和匹配作为一个组合语句进行?

我将提供一些上下文:

我将使用 '(1998.{0,10})' 的示例正则表达式模式,但我实际上对任何类型的模式都感兴趣,而不仅仅是这个示例字符串。

所需的模式匹配,但似乎没有使用 pg_trgm 索引(注意标题是另一个字段,但不是我匹配的那个):

现在,添加 WHERE 字段。

但是,如果我们删除模式匹配,我们会得到更好的性能,所以我怀疑我们做了两次相同的工作:

此外,如果有任何关于如何在 postgres 中进行正则表达式模式匹配时获得最佳性能的建议,我将不胜感激进一步的材料。我不受限于任何版本的 postgres。

0 投票
1 回答
2849 浏览

postgresql - 使用 pg_trgm 搜索 3 亿个地址

我的 PostgreSQL 9.3 数据库中有 3 亿个地址,我想使用 pg_trgm 来模糊搜索行。最终目的是实现一个搜索功能,就像谷歌地图搜索一样。

当我使用 pg_trgm 搜索这些地址时,大约需要 30 秒才能得到结果。有很多行与默认的相似度阈值条件 0.3 匹配,但我只需要大约 5 或 10 个结果。我创建了一个三元组 GiST 索引:

这是我的查询:

生产环境的测试表已被删除。我展示了EXPLAIN我的测试环境的输出。大约有 700 万行,大约需要 1.6 秒才能得到结果。3亿,需要30s以上。

有没有提高性能的好方法,还是做表分区的好计划?

0 投票
1 回答
68 浏览

postgresql - Postgres trigram 搜索中 AND OR NOT 的语法是什么?

我已经在我的应用程序中实现了 Postgres 9.6 trigram search https://www.postgresql.org/docs/9.6/static/pgtrgm.html,它适用于单个搜索词。

我看不到如何允许我的用户进行 AND OR NOT 搜索。

目前,如果我将“perl”放入搜索字段,它将返回数百个结果。这很棒,而且效果很好。

现在,如果我想搜索包含“perl”和“javascript”的文档,无论我输入什么搜索词,都不会返回任何结果。

例如,我尝试过:

因此,我正在努力研究如何为最终用户提供比仅单个词更复杂的搜索。我希望我的应用程序用户能够使用和/或/不进行全文搜索。

可能吗?如果是,语法是什么?

0 投票
1 回答
202 浏览

postgresql - postgresql pg_trgm 通过 where 条件加速

我使用 pg_trgm 扩展来检查文本列的相似性。我想通过使用附加条件来加速它,但没有成功。速度是一样的。这是我的例子:

因此,当我执行查询时,是否使用 where 子句没有区别。

这是正确的吗?

0 投票
1 回答
4721 浏览

sql - PostgreSQL中的全文搜索与模糊搜索相结合

我想在 postgresql 中结合一种模糊搜索来实现全文搜索。对于我的测试区域,我跟进了这篇文章:https ://blog.lateral.io/2015/05/full-text-search-in-milliseconds-with-postgresql/ ,一切正常。但有时我在 search 字符串中有带和不带空格的搜索案例,如下所示:

在我的“标题”列中,有一个类似“ test123 ”的条目。我的搜索字符串看起来像“ test 123,其中有一个空格。我怎样才能在这个测试用例中获得成功?

我的 search-sql-query 看起来像:

所以我试图弄清楚是否可以将 pg_trgm 与 ts_vector 结合使用,但我找不到解决方案。你有想法吗?

0 投票
1 回答
1110 浏览

postgresql - 如何使用 pg_trgm 按相似值分组

我有下表

我希望能够得到一个按相似度计算的结果,其中 > 80% 的相似度意味着两个错误相等。我一直在使用 pg_trgm 扩展,它的相似性函数对我来说非常有效,我唯一能弄清楚如何产生下面的分组结果。

0 投票
1 回答
1086 浏览

postgresql - 如何使用日期列创建 pg_trgm 复合索引

这里 col1 是数据类型varchar,日期是timestamp with time zone数据类型。所以创建了扩展CREATE EXTENSION pg_trgm

然后尝试了以下索引并得到了错误:

1:问题:错误:操作员类“gin_trgm_ops”不接受带时区的数据类型时间戳

2:问题:错误:访问方法“gin”不存在操作员类“text_pattern_ops”

如何为上述查询创建索引以加快执行速度?任何帮助将不胜感激!

编辑:所以这在语法上有效,但不会加快查询速度:

0 投票
1 回答
183 浏览

postgresql - How to use pg_trgm functions in JOOQ

Is it possible to use pg_trgm functions as similarity in JOOQ?

0 投票
1 回答
264 浏览

postgresql - Postgres pg_trgm 模块中的相似度是如何计算的

有人可以向我解释一下 Postgres pg_trgm 模块中的相似度函数是如何计算的吗?

例如similarity('sage', 'message') = 0.3

我看不出我们如何从这 3 个量中得到一个等于 0.3 的公式。我本来希望它基于一个常见的字符串相似性度量(例如 Dice-Sorensen)

IE2*nt / (n1 + n2) = 6/13 = 0.46

pg_trgm 相似度分数对我来说似乎异常低