问题标签 [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.
postgresql - 关闭 trgm 索引中的重新检查
我们有一个使用 trigrams 索引 (pg_trgm) 的 postgres 列。
索引运行良好,但速度非常慢:最终重新检查误报会消耗 >99% 的整体查询时间(位图索引扫描 0.25 秒;重新检查 30.7 秒)。
在我们的例子中,误报是无关紧要的(罕见+我们不在乎),所以重新检查是没有用的。
有没有办法关闭/禁用重新检查步骤,跳过验证误报?最好的方法是什么?
postgresql - 使用 pg_trgm 将小表(<1,000 行)与大表(>100m 行)匹配——最有效的方法?
这是我在处理各种不同数据集的工作中经常出现的问题,所以请原谅我笼统地介绍它,而不是使用具体的例子。
我经常需要从一个大表(通常为数百万行)中获取记录,其中一个文本列类似于一个小得多的表(10 到 100 行)中的列。我目前的做法如下,targets
小表在哪里matches
,大表在哪里。
matches.name
将具有 GIN 索引,并且通常具有相对较高的唯一性,可能有 10-20% 的记录是重复的。两者matches.name
和targets.name
几乎总是少于 50 个字符,而且通常短得多。
据我了解,这是一个稍微不寻常的用例:Postgres 文档和大多数 SO 答案似乎都集中在优化以匹配单个值。所以我很想听听关于两个问题的想法:
- 笼统地说(几十分钟、几小时等),并假设数据库配置得最优化,就性能而言,这种类型的查询的合理目标是什么,例如,给定 300 个目标和 3 亿个潜在匹配项?
- 在给定参数的情况下,我目前使用的策略是最有效的策略吗?例如,是否值得尝试使用 GiST 索引并使用运算符获取每行的前n 个匹配项
<->
?是否有完全不同的方法可以更有效?
在此先感谢您的帮助!
django - 如何通过 makemigrations 安装 Django pg_trgm?
我有一个 Django 应用程序和一个 Postgresql 数据库(在生产中)。现在我想为 Postgres 安装 pg_trgm 扩展。但我找不到任何从 Django 应用程序安装它的分步说明。我有超级用户身份。如何正确执行?
postgresql - Better Postgres trigram ranking
I'm searching several million names and addresses in a Postgres table. I'd like to use pg_trgm to do fast fuzzy search.
My app is actually very similar to the one in Optimizing a postgres similarity query (pg_trgm + gin index), and the answer there is pretty good.
My problem is that the relevance ranking isn't very good. There are two issues:
I want names to get a heavier weight in the ranking than addresses, and it's not clear how to do that and still get good performance. For example, if a user searches for 'smith', I want 'Bob Smith' to appear higher in the results than '123 Smith Street'.
The current results are biased toward columns that contain fewer characters. For example, a search for 'bob' will rank 'Bobby Smith' (without an address) above 'Bob Smith, 123 Bob Street, Smithville Illinois, 12345 with some other info here'. The reason for this is that the similarity score penalizes for parts of the string that do not match the search terms.
I'm thinking that I'll get a much better result if I could get a score that simply returns the number of matched trigrams in a record, not the number of trigrams scaled by the length of the target string. That's the way most search engines (like Elastic) work -- they rank by the weighted number of hits and do not penalize long documents.
Is it possible to do this with pg_trgm AND get good (sub-second) performance? I could do an arbitrary ranking of results, but if the ORDER BY clause does not match the index, then performance will be poor.
python - Django TrigramSimilarity 在 GIN 索引上返回全文搜索错误
您好,我正在尝试在 GIN 索引列上使用 postgresql/FTS 在 Django 上进行搜索,但出现了一个奇怪的错误。此错误不会出现在 CharField 上,而只会出现在 SearchVectorField 上:
Postgresql 数据库安装了 pg_trgm 扩展(在 Django 迁移中)
这是对象:
这是我的查询:
它返回一条错误消息:
如果我使用标准CharField而不是 GIN 索引SearchVectorField,则不会发生错误:
难道我做错了什么 ?
我也在使用 Django-model-translation 和这个对象的标签列:
postgresql - 通过 PostgreSQL 中的 GiST 索引对 bigint 列进行奇怪的排序行为
我正在使用自定义排序在 PostgreSQL 12.6 (Ubuntu 20.04.2 VBox) 中实现快速文本搜索,并且我正在使用pg_trgm和 GiST ( btree_gist ) 索引来排序输出。这个想法是返回播放次数最多的前 5 名匹配艺术家。索引是这样创建的:
这里的“name”是类型varchar(255)
,total_play_count 是bigint
,不允许有空值。
当我这样查询表时:
我得到正确的结果:
如果我total_play_count <-> 40312
用 simple替换,我会得到相同的结果total_play_count desc
,但是我会得到我想要避免的额外排序操作。此处的数字40312是该列的当前最大值,表本身总共包含 1612297 行。
但是,由于 total_play_count 是 bigint 类型,我想让这个查询更通用(更快)并使用 bigint 的最大值,所以我不必每次都查询最大值。但是当我用 更新 ORDER BY 子句时total_play_count <-> 9223372036854775807
,我得到以下结果:
这里的排序被破坏了,当我在另一个有更多行的表上尝试相同的方法时,情况更糟。没有负值或过大的值,因此应该不可能溢出。结果explain
几乎相同:
这里可能是什么问题?这是一个错误btree_gist
,还是我错过了什么?我可以满足于查询最大值,但它让我担心最终可能会达到一个阈值并破坏搜索,这将是一种耻辱,因为我对性能非常满意。
更新:
我尝试使用常规整数类型而不是 bigint,然后使用它的上限进行查询total_play_count <-> 2147483647
。似乎没有这样的问题。也许bigint
一开始使用有点乐观,但如果有人有答案或解决方法,我会保持开放。
python-3.x - 如何在 python 中使用 pg_trgm 运算符,例如 (<-> )
我在 PostgreSQL DB 上使用 pg_trgm 进行相似性搜索,我需要将结果返回到 PostGIS 表,但是我收到了这个程序员错误,我了解到这个错误与我尝试相同查询的 sql 查询的语法有关在 PostgreSQL 中并且它工作,但无法让它与 python 一起工作。我使用什么(Windows 10、Python 3.8、PostgreSQL 12.6)
ProgrammingError:无效 dsn:在连接信息字符串中的“C:\Users\Lenovo\AppData\Roaming\jupyter\runtime\kernel-ee3068bc-0b95-4bba-a373-752c8196980f.json”之后缺少“=”
ruby-on-rails - 使用 GIN 和 pg_trgm 索引 jsonb 列键,用于 Rails 中的 ILIKE 查询
我有一个具有以下结构的表“Leads”:
user_details jsonb 列以 {name : "John Doe", country : "IN", phone_no : "123456789"} 的形式存储数据。我想使用ILIKE查询我的数据库列作为名称键:
为此,我创建了一个迁移,如下所示:
这将创建必要的索引。我已经在之前的迁移中启用了 pg_trgm 扩展。我的structure.sql看起来像:
此外,相应的schema.rb为潜在客户表添加了以下行 -
另一方面,如果我为整个 user_details 列创建一个 gin 索引,然后使用"@> {name: "john"}.to_json"进行查询,它将使用索引进行扫描
我的 Rails 版本是5.2.0和 PostgreSQL 版本是12.5。对于这个用例,我如何使用ILIKE查询?我哪里错了?如有必要,我很乐意提供更多详细信息。
greenplum - 在 postgres 9.4.24 上安装 pg_trgm
我正在尝试在使用 postgres 9.4.24 版本的 Greemplum 系统上使用相似度函数。Greenplum 系统在 CentOS 7 集群上运行(CentOS Linux release 7.9.2009 (Core))
我已经设法通过运行这个来安装 postgresql-contrib 包:
但是,当我在数据库上运行此命令时: create extension pg_trgm(); 我得到以下信息:;
我查看了目录,但 pg_trgm.control 不存在,但我期待它,因为我安装了 contrib 包。
有什么我错过的吗?
我找到了 Greenplum 的 contrib 存储库并在此处下载了代码: https ://github.com/greenplum-db/gpdb/tree/master 其中包括带有所有扩展的 contrib 目录。
但是,当我尝试 make && make install 时,出现错误:
查看目录结构和文件,Makefile.global 不存在而 contrib-global.mk 存在但不确定路径是否正确,我可以尝试更改 Makefile 中的路径但不确定。
这些是 Makefile 文件的内容:
我检查了 /tmp 文件夹中的代码,它在 /tmp/gpdb 下创建了结构
更新:我确实遵循了布拉德福德的建议并且能够编译和安装,但是,当我运行时我得到了这个:
create extension pg_trgm
;
错误:无法打开扩展控制文件“/usr/local/greenplum-db-6.13.0/share/postgresql/extension/pg_trgm.control”:没有这样的文件或目录(seg57 172.28.8.8:6001 pid=146663)
运行 make 和 make install 后,我确实手动运行了:
我可以在那里看到 .control 文件,所以不确定发生了什么,它似乎只复制到主服务器而不是分段主机,这会是一个问题吗?我需要在每个段主机上编译它吗?
更新: 我确实在每个段上都安装了,现在我得到了:
SQL 错误 [0A000]:错误:不支持具有多个 segworker 组的查询计划提示:可能由读取或修改分布式表中数据的函数引起
greenplum 不支持这个扩展吗?
postgresql - AWS Postgres 设置 pg_trgm.word_similarity_threshold
我正在尝试在 RDS postgres (13) 实例上设置pg_trgm.word_similarity_threshold GUC 参数。
我尝试使用部署后 SQL 脚本对其进行设置:
但这会导致错误:Npgsql.PostgresException (0x80004005): 42501: permission denied for function pg_reload_conf
我还尝试通过将其传递到参数列表中来通过 terraform 进行设置:
导致错误:Error modifying DB Parameter Group: InvalidParameterValue: Could not find parameter with name: pg_trgm.word_similarity_threshold
即使 pg_trgm 是一个受支持的扩展,这个参数似乎在 postgres 参数组中不可用。有没有办法在我的 AWS Postgres RDS 中设置这个参数?