LIKE-запрос к элементам плоского массива jsonb - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть таблица Postgres posts со столбцом типа jsonb, который в основном представляет собой плоский массив тегов.

Что мне нужно сделать, так это как-то выполнить запрос LIKE для элементов этого tags столбца, чтобы я мог найти сообщения, теги которых начинаются с какой-то частичной строки.

Возможна ли такая вещь в Postgres? Я постоянно нахожу супер сложные примеры, и никто никогда не описывает такой простой и простой сценарий.

Мой текущий код отлично работает для проверки наличия сообщений с определенными тегами:

select * from posts where tags @> '"TAG"'

и я ищу способ запустить что-то среди строк

select * from posts where tags @> '"%TAG%"'

1 Ответ

0 голосов
/ 01 мая 2018
SELECT *
FROM   posts p
WHERE  EXISTS (
   SELECT FROM jsonb_array_elements_text(p.tags) tag
   WHERE  tag LIKE '%TAG%'
   );

Связано с объяснением:

Это не может использовать какие-либо индексы. Так медленно для больших столов. Нормализованный дизайн, , как уже предлагал Лоренц, будет лучше - с индексом триграммы:

Для простого соответствия префикса (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 или более поздней версии.

Связанный:

...