我必须编写一个简单的查询,在其中查找以 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
给定一个可能包含多个分隔符实例的字符串,我想生成从该字符开始的所有子字符串。
例如,给定一个像'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。
我需要一个基于指定字符串搜索记录的建议。
搜索字符串可以包含来自这些列的值。此字符串中的值不必以正确的顺序严格相同,并且此字符串中某些列的值可能会丢失。
搜索字符串示例:
22 Karntner Wien
Run Code Online (Sandbox Code Playgroud)
例如,我得到了前 5 条类似记录的结果。
我想我应该使用全文搜索,但我没有使用它的经验。你能告诉我如何进行吗?
我在 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) 我正在尝试在 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 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
我有一个包含文本列的表格,我想按word搜索,而不是lexeme。更重要的是,我想按单词而不是词素进行索引。我们有大量代码引用的错误转储,它们不适用于任何自然语言词典。
Postgres 有没有办法让 FTS 按单词边界解析而不将单词解析为词素?如果我必须定义一个边界字符列表和一个跳过词目录,那可能没问题。这是否需要制作某种自定义词典,还是已经有类似的东西可用?
我一直认为我错过了一些明显的东西,然后找不到它。
目前,trigram 索引还可以,但我真的更喜欢文本的唯一关键字解析器。
RDS 上的 Postgres 11.4。