相关疑难解决方法(0)

PostgreSQL 中 LIKE、SIMILAR TO 或正则表达式的模式匹配

我必须编写一个简单的查询,在其中查找以 B 或 D 开头的人名:

SELECT s.name 
FROM spelers s 
WHERE s.name LIKE 'B%' OR s.name LIKE 'D%'
ORDER BY 1
Run Code Online (Sandbox Code Playgroud)

我想知道是否有办法重写它以提高性能。所以我可以避免or和/或like?

postgresql index regular-expression pattern-matching string-searching

123
推荐指数
3
解决办法
18万
查看次数

如何在分隔符之后生成所有尾随子字符串?

给定一个可能包含多个分隔符实例的字符串,我想生成从该字符开始的所有子字符串。

例如,给定一个像'a.b.c.d.e'(或 array {a,b,c,d,e},我想)这样的字符串,我想生成一个像这样的数组:

{a.b.c.d.e, b.c.d.e, c.d.e, d.e, e}
Run Code Online (Sandbox Code Playgroud)

预期用途是作为填充一列的触发器,以便在写入另一列时更容易地查询域名部分(即,查找全部q.x.t.com以进行查询t.com)。

解决这个问题似乎是一种笨拙的方法(而且很可能是),但现在我很好奇如何用(Postgres')SQL 编写这样的函数。

这些是电子邮件域名,因此很难说元素的最大可能数量是多少,但绝大多数肯定会小于 5。

postgresql pattern-matching array

8
推荐指数
2
解决办法
1100
查看次数

PostgreSQL 在许多列上进行全文搜索

我需要一个基于指定字符串搜索记录的建议。

搜索字符串可以包含来自这些列的值。此字符串中的值不必以正确的顺序严格相同,并且此字符串中某些列的值可能会丢失。

搜索字符串示例:

22 Karntner Wien
Run Code Online (Sandbox Code Playgroud)

例如,我得到了前 5 条类似记录的结果。

我想我应该使用全文搜索,但我没有使用它的经验。你能告诉我如何进行吗?

postgresql full-text-search pattern-matching

8
推荐指数
1
解决办法
1万
查看次数

使用 SIMILAR TO 和许多前缀优化查询

我在 PostgreSQL 9.6中有一个查询需要很长时间才能运行:

SELECT DISTINCT ON (gc.number)
       gc.number, gc.code, ch.client_id, ch.client_parent_id
FROM client gc, client_hierarchy ch
WHERE gc.code = ch.client_id
AND gc.number in (SELECT NUMB FROM directory
                  WHERE ACTIVE = TRUE
                  AND NUMB SIMILAR TO '(ABTR|GREW|POEW)%');
Run Code Online (Sandbox Code Playgroud)

SIMILAR TO接收许多不同NUMB的作为参数。ABTR|GREW|POEW大约 3.500 多。

表定义:

CREATE TABLE directory (
    id BIGINT PRIMARY KEY NOT NULL,
    active BOOLEAN NOT NULL,
    numb VARCHAR(8),
    branch VARCHAR(20),
    city VARCHAR(50),
    modified_date TIMESTAMP NOT NULL,
    name VARCHAR(200)
);
CREATE INDEX dir_numb_index ON directory (numb); …
Run Code Online (Sandbox Code Playgroud)

postgresql performance index postgresql-performance

5
推荐指数
1
解决办法
123
查看次数

如何使用全文搜索进行中后缀匹配?

我正在尝试在 Postgres 上使用 FTS 在数据库中查找字符串:

select name
from users
where to_tsvector('simple', name) @@ to_tsquery('simple', 'ad:*')
Run Code Online (Sandbox Code Playgroud)

但:*搜索只有以广告开头的词。

我发现这个问题 Get partial match from Get partial match from GIN indexed TSVECTORcolumn column。

但是没有提到如何使用FTS解决中后缀匹配的问题?

postgresql full-text-search

5
推荐指数
2
解决办法
4055
查看次数

升级 Postgres 后查询性能下降

我在 PostgreSQL 12 数据库中有一个包含数百万条记录的表,从 11 升级到 12 后,一些查询开始表现得很糟糕。他们从大约 1 秒缩短到大约 5 分钟。我尝试重建所有索引、清理以及所有常见的 Postgres 容易实现的目标,但性能仍然很糟糕。

这是查询:

SELECT id, activity_count
FROM user
WHERE (search_index) @@ (to_tsquery('pg_catalog.english', '''1234567890'':*') AND active = true
ORDER BY activity_count DESC LIMIT 101
Run Code Online (Sandbox Code Playgroud)

换句话说,找到与给定帐号匹配的所有活跃用户,并从最活跃到最不活跃进行排序。

此查询大约需要 5 分钟才能返回 2 条记录。有什么不对劲。

该列search_index是一个 tsvector,存储表的各个文本字段中的所有关键字(只是帐户编号、名称等)。

我为此列创建了一个 GIN 索引:

CREATE INDEX user_search_index_gin
    ON public.user USING gin
    (search_index)
    TABLESPACE pg_default;
Run Code Online (Sandbox Code Playgroud)

我还有一个该active列的索引:

CREATE INDEX user_active
    ON public.user USING btree
    (active ASC NULLS LAST)
    TABLESPACE pg_default;
Run Code Online (Sandbox Code Playgroud)

我有一个有序索引activity_count:

CREATE INDEX user_activity_count …
Run Code Online (Sandbox Code Playgroud)

postgresql statistics upgrade postgresql-12 query-performance

4
推荐指数
1
解决办法
4256
查看次数

Postgres 对单词的全文搜索,而不是词素

我有一个包含文本列的表格,我想按word搜索,而不是lexeme。更重要的是,我想按单词而不是词素进行索引。我们有大量代码引用的错误转储,它们不适用于任何自然语言词典。

Postgres 有没有办法让 FTS 按单词边界解析而不将单词解析为词素?如果我必须定义一个边界字符列表和一个跳过词目录,那可能没问题。这是否需要制作某种自定义词典,还是已经有类似的东西可用?

我一直认为我错过了一些明显的东西,然后找不到它。

目前,trigram 索引还可以,但我真的更喜欢文本的唯一关键字解析器。

RDS 上的 Postgres 11.4。

postgresql full-text-search

3
推荐指数
1
解决办法
1070
查看次数