问题标签 [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 回答
222 浏览

sql - 如何加快 pg_trgm?

创建表:

询问:

如何加快这个查询?

0 投票
1 回答
1732 浏览

ruby-on-rails - 在 Rails 5 中向 Postgres 表添加三元组索引

Postgres 允许使用pg_trgm 模块进行三元索引。

这是他们在“索引支持”部分提供的示例代码:

这是我提出的迁移:

有没有更好的方法来添加这个迁移?我什至不确定这是否正确。

0 投票
1 回答
407 浏览

sql - 在子查询 PostgreSQL 之前更改 GUC 参数

我目前正在做这样的查询:

A 和 B 都是同一个基础表 C 的视图,具有完全相同的列。

但是,%操作员使用 GUC 参数pg_trgm.similarity_threshold来计算first_name % 'fakeFirstName'last_name % 'fakeLastName',我的目标是在每个子查询之前更改此参数,因为这两列的相似度阈值不同。

要更改pg_trgm.similarity_threshold参数,例如值 0.2,我有两个选择:

  • SET pg_trgm.similarity_threshold = 0.2;
  • SELECT set_limit(0.2);

我非常关心执行速度,这意味着我更喜欢使用%带有 GIN 索引的<->操作而不是带有 GIST 索引的操作符。

我试图做类似下面的事情,但它没有工作,因为在set_limit()使用运算符之前没有调用该函数%

任何帮助都深表感谢。

0 投票
1 回答
148 浏览

postgresql - 我如何使用 pg_trgm 更允许

我使用 pg_trgrm 来检查字符串匹配,我对结果非常满意。但这并不是我想要的方式。我希望像“poduto”这样的搜索会找到“produtos”(缺少 r)。并且“sofáa”也可以找到“sofa”。我正在使用 posgresql 9.6。

当我输入“vermelo”(缺少h)时,它确实找到了“vermelho”。当我输入“sof”时,它确实找到了“沙发”。似乎只有中间的一些字母可以省略,我总是会错过最后一个字母。我希望能够错过单词中间的任何字母。在 sofáa 和 sofá 的情况下也可以犯“两个错误”(我使用了重音并使用了一个额外的“a”)。

0 投票
0 回答
280 浏览

postgresql - 有没有办法在 PostgreSQL 上使用带有 btree 索引的 pg_trgm 运算符?

我有两张桌子:

  • table_1 有大约 100 万行,列 id_t1:整数,c1_t1:varchar 等。
  • table_2 有大约 5000 万行,列 id_t2:整数,ref_id_t1:整数,c1_t2:varchar 等。

ref_id_t1 填充了 id_t1 值,但是它们没有通过外键链接,因为 table_2 不知道 table_1。

我需要在两个表上做一个请求,如下所示:

在没有任何更改或基本索引的情况下,请求大约需要一分钟才能完成,因为在 table_2 上执行顺序扫描。为了防止这种情况,我使用 gin_trgm_ops 选项创建了一个 GIN 索引:

然而这并不能解决问题,因为内部请求仍然需要很长时间。

给出以下

位图索引扫描很快,但我们需要 t2.ref_id_t1 PostgreSQL 需要执行位图堆扫描,这对 65000 行数据并不快。

避免位图堆扫描的解决方案是执行仅索引扫描。这可以使用带有 btree 索引的多列,请参阅https://www.postgresql.org/docs/9.6/static/indexes-index-only-scans.html

如果我将请求更改为搜索 c1_t2 的开头,即使内部请求返回 90000 行,并且如果我在 c1_t2 和 ref_id_t1 上创建 btree 索引,则请求只需一秒钟多一点。

然而,这对于 gin 索引是不可能的,因为这些索引不会将所有数据存储在键中。

有没有办法使用带有 btree 索引的 pg_trmg 扩展,这样我们就可以使用LIKE '%abc%'请求进行仅索引扫描?

0 投票
1 回答
920 浏览

postgresql - postgresql pg_trgm.word_similarity_threshold 递减

将 pg_trgm.word_similarity_threshold 设置为 0.2;降低当前会话的阈值,但不对数据库执行此操作。我需要降低支持拼写错误的门槛。

0 投票
1 回答
150 浏览

ruby-on-rails - Rails 5、Postgres、ActiveRecord - 如何将函数值包含为模型字段

我在 Rails 5 应用程序中为 Postgres 使用 Trigram 模块 (pg_trgm) 进行文本搜索。我已经能够使用以下调用成功找到令人满意的结果,以查找名称与查询相似的记录的限制数量:

我现在想扩展结果以包括每条记录的相似性函数的值和用于显示 的目标查询。

我相信我应该设置一个范围(或类方法),我可以在其中对距离运算符(名称 <-> ?)进行参数化调用,然后返回值,就好像它是数据库模型中的一个属性一样。

我可以就执行此操作的最佳做​​法提出建议吗?谢谢你。

0 投票
1 回答
81 浏览

sql - 模糊日期搜索/使用日期类型优化 LIKE

好吧,我会很简单——在我的应用程序中实现生日搜索时,我遇到了巨大的性能下降——我使用的是 LIKE,这不是左锚表达式(因为日期列格式看起来像 YYYY-MM-DD),所以我必须这样做(%-本月-本日),并且此查询不能使用默认索引。

我发现了pg-trgm东西,这实际上非常棒,但是 gist/gin_trgm_ops 运算符不支持“日期”类型。您可能会说,如果我使用 LIKE,将日期作为列类型是没有意义的 -::varchar无论如何我都必须这样做,但我希望在我的数据库中设置严格,所以我正在征求意见 - 有没有办法LIKE 使用日期更快地工作,或者,如果有其他选项,如何在没有那么长的查询时间的情况下完成我的任务(进行生日搜索)?

0 投票
0 回答
302 浏览

postgresql-9.5 - Postgres 9.5 缓存查找失败

我正在尝试通过执行CREATE EXTENSION pg_trgm. pg_trgm--1.1.sql 的第一个可执行行是

psql -f pg_trgm--1.1.sql在 psql 中运行这一行或使用throws error启动 psql ERROR: cache lookup failed for function 1。知道为什么会发生这种情况。我也试过

效果很好。我是否必须安装一些东西才能使用 C 语言创建 sql 函数?我已经为 postgres 安装了 contrib 使用sudo apt-get install postgresql-contrib

0 投票
0 回答
528 浏览

postgresql - BIGINT 列的 PostgreSQL GIN 索引

我有tbl带有列的表 - 数据 TEXT - fk_id BIGINT - 文本 TEXT

有超过 1 亿条记录,fk_id 有大约 1K 不同的值。我需要像这样运行查询

SELECT * FROM tbl WHERE fk_id=12345 AND text LIKE '%abcdef%

我尝试使用扩展GIN索引btree_gingin_trgm_ops

CREATE EXTENSION pg_trgm; CREATE EXTENSION btree_gin;

CREATE INDEX on tbl USING GIN (fk_id, text gin_trgm_ops)

但查询分析器忽略fk_id查询列

explain select * from tbl where fk_id = 12345 and text like '%abcdef%' limit 10;

但是,如果我对列 fk_id 使用 INT 类型而不是 BIGINT,则索引将按预期工作

tbl - 数据 TEXT - fk_id INT - 文本 TEXT

explain select * from tbl where fk_id = 12345 and text like '%abcdef%' limit 10;

所以,我可以将 GIN 与 INT 一起使用,但不能将 GIN 与 BIGINT 一起使用。为什么我不能将 BIGINT 列用于 GIN 索引? 文档说,btree_gin 与 int4(INT) 和 int8(BIGINT) 一起使用。也许还有另一种方法可以解决这个问题?