我有一个Postgres表posts
,其中包含jsonb
类型的列,它基本上是一个平面的标记数组。
我需要做的是以某种方式对tags
列元素运行LIKE查询,这样我就可以找到一个帖子,其中的标签以某个部分字符串开头。
Postgres有可能吗?我一直在寻找超级复杂的例子,没有人会描述这种基本和简单的场景。
我当前的代码可以正常检查是否有帖子有特定标签:
select * from posts where tags @> '"TAG"'
我正在寻找一种在
之间运行的方法select * from posts where tags @> '"%TAG%"'
答案 0 :(得分:3)
SELECT *
FROM posts p
WHERE EXISTS (
SELECT FROM jsonb_array_elements_text(p.tags) tag
WHERE tag LIKE '%TAG%'
);
相关,有解释:
这不能使用任何索引。大桌子这么慢。标准化设计like Laurenz already suggested将更优越 - 具有三元组索引:
对于前缀匹配(LIKE 'TAG%'
,没有前导通配符),您可以使用全文索引:
CREATE INDEX posts_tags_fts_gin_idx ON posts USING GIN (to_tsvector('simple', tags));
一个匹配的查询:
SELECT *
FROM posts p
WHERE to_tsvector('simple', tags) @@ 'TAG:*'::tsquery
如果您想要自然英语语言,请使用english
词典而不是simple
(或任何适合您的情况)。
to_tsvector(json(b))
需要 Postgres 10 或更高版本。
相关: