问题标签 [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 - 优化 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
.
postgresql - 使用 pg_trgm 进行正则表达式模式匹配(三元组匹配)
我在 postgresql 中有一个名为 mydata 的数据库,其中包含一个名为 text 的字段。我有兴趣进行正则表达式模式匹配,只返回匹配的片段,而不是整个文本。我知道您可以使用 pg_trgm(创建三元组匹配索引)来加快搜索速度,但是有没有办法将搜索和匹配作为一个组合语句进行?
我将提供一些上下文:
我将使用 '(1998.{0,10})' 的示例正则表达式模式,但我实际上对任何类型的模式都感兴趣,而不仅仅是这个示例字符串。
所需的模式匹配,但似乎没有使用 pg_trgm 索引(注意标题是另一个字段,但不是我匹配的那个):
现在,添加 WHERE 字段。
但是,如果我们删除模式匹配,我们会得到更好的性能,所以我怀疑我们做了两次相同的工作:
此外,如果有任何关于如何在 postgres 中进行正则表达式模式匹配时获得最佳性能的建议,我将不胜感激进一步的材料。我不受限于任何版本的 postgres。
postgresql - 使用 pg_trgm 搜索 3 亿个地址
我的 PostgreSQL 9.3 数据库中有 3 亿个地址,我想使用 pg_trgm 来模糊搜索行。最终目的是实现一个搜索功能,就像谷歌地图搜索一样。
当我使用 pg_trgm 搜索这些地址时,大约需要 30 秒才能得到结果。有很多行与默认的相似度阈值条件 0.3 匹配,但我只需要大约 5 或 10 个结果。我创建了一个三元组 GiST 索引:
这是我的查询:
生产环境的测试表已被删除。我展示了EXPLAIN
我的测试环境的输出。大约有 700 万行,大约需要 1.6 秒才能得到结果。3亿,需要30s以上。
有没有提高性能的好方法,还是做表分区的好计划?
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”的文档,无论我输入什么搜索词,都不会返回任何结果。
例如,我尝试过:
因此,我正在努力研究如何为最终用户提供比仅单个词更复杂的搜索。我希望我的应用程序用户能够使用和/或/不进行全文搜索。
可能吗?如果是,语法是什么?
postgresql - postgresql pg_trgm 通过 where 条件加速
我使用 pg_trgm 扩展来检查文本列的相似性。我想通过使用附加条件来加速它,但没有成功。速度是一样的。这是我的例子:
因此,当我执行查询时,是否使用 where 子句没有区别。
这是正确的吗?
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 结合使用,但我找不到解决方案。你有想法吗?
postgresql - 如何使用 pg_trgm 按相似值分组
我有下表
我希望能够得到一个按相似度计算的结果,其中 > 80% 的相似度意味着两个错误相等。我一直在使用 pg_trgm 扩展,它的相似性函数对我来说非常有效,我唯一能弄清楚如何产生下面的分组结果。
postgresql - 如何使用日期列创建 pg_trgm 复合索引
这里 col1 是数据类型varchar
,日期是timestamp with time zone
数据类型。所以创建了扩展CREATE EXTENSION pg_trgm
然后尝试了以下索引并得到了错误:
1:问题:错误:操作员类“gin_trgm_ops”不接受带时区的数据类型时间戳
2:问题:错误:访问方法“gin”不存在操作员类“text_pattern_ops”
如何为上述查询创建索引以加快执行速度?任何帮助将不胜感激!
编辑:所以这在语法上有效,但不会加快查询速度:
postgresql - How to use pg_trgm functions in JOOQ
Is it possible to use pg_trgm
functions as similarity
in JOOQ?
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 相似度分数对我来说似乎异常低