问题标签 [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.
sql - 如何加快 pg_trgm?
创建表:
询问:
如何加快这个查询?
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()
使用运算符之前没有调用该函数%
:
任何帮助都深表感谢。
postgresql - 我如何使用 pg_trgm 更允许
我使用 pg_trgrm 来检查字符串匹配,我对结果非常满意。但这并不是我想要的方式。我希望像“poduto”这样的搜索会找到“produtos”(缺少 r)。并且“sofáa”也可以找到“sofa”。我正在使用 posgresql 9.6。
当我输入“vermelo”(缺少h)时,它确实找到了“vermelho”。当我输入“sof”时,它确实找到了“沙发”。似乎只有中间的一些字母可以省略,我总是会错过最后一个字母。我希望能够错过单词中间的任何字母。在 sofáa 和 sofá 的情况下也可以犯“两个错误”(我使用了重音并使用了一个额外的“a”)。
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%'请求进行仅索引扫描?
postgresql - postgresql pg_trgm.word_similarity_threshold 递减
将 pg_trgm.word_similarity_threshold 设置为 0.2;降低当前会话的阈值,但不对数据库执行此操作。我需要降低支持拼写错误的门槛。
ruby-on-rails - Rails 5、Postgres、ActiveRecord - 如何将函数值包含为模型字段
我在 Rails 5 应用程序中为 Postgres 使用 Trigram 模块 (pg_trgm) 进行文本搜索。我已经能够使用以下调用成功找到令人满意的结果,以查找名称与查询相似的记录的限制数量:
我现在想扩展结果以包括每条记录的相似性函数的值和用于显示 的目标查询。
我相信我应该设置一个范围(或类方法),我可以在其中对距离运算符(名称 <-> ?)进行参数化调用,然后返回值,就好像它是数据库模型中的一个属性一样。
我可以就执行此操作的最佳做法提出建议吗?谢谢你。
sql - 模糊日期搜索/使用日期类型优化 LIKE
好吧,我会很简单——在我的应用程序中实现生日搜索时,我遇到了巨大的性能下降——我使用的是 LIKE,这不是左锚表达式(因为日期列格式看起来像 YYYY-MM-DD),所以我必须这样做(%-本月-本日),并且此查询不能使用默认索引。
我发现了pg-trgm
东西,这实际上非常棒,但是 gist/gin_trgm_ops 运算符不支持“日期”类型。您可能会说,如果我使用 LIKE,将日期作为列类型是没有意义的 -::varchar
无论如何我都必须这样做,但我希望在我的数据库中设置严格,所以我正在征求意见 - 有没有办法LIKE 使用日期更快地工作,或者,如果有其他选项,如何在没有那么长的查询时间的情况下完成我的任务(进行生日搜索)?
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
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_gin
和gin_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) 一起使用。也许还有另一种方法可以解决这个问题?