PostgreSQL текстовый поиск с индексом в массиве Jsonb - PullRequest
0 голосов
/ 04 мая 2020

Учитывая следующий набор данных:

-- Create random table
CREATE TABLE sample (
    id serial primary key,
    content jsonb
);

-- Insert sample rows
INSERT INTO sample (content)
VALUES 
    ('{"text": ["Lorem ipsum dolor sit amet","consectetur adipiscing elit","sed do eiusmod tempor incididunt","ut labore et dolore magna aliqua"]}'), 
    ('{"text": ["Ut enim ad minim veniam","quis nostrud exercitation ullamco laboris","nisi ut aliquip ex ea commodo consequat","Duis aute irure dolor in reprehenderit","voluptate velit esse cillum dolore"]}'), 
    ('{"text": ["eu fugiat nulla pariatur","Excepteur sint occaecat cupidatat","non proident, sunt in culpa qui","officia deserunt mollit anim id est laborum"]}')
;

content - столбец JSONB, содержащий ключ text, который представляет собой массив текстов Json.

Я бы хотел чтобы иметь возможность выполнять поиск с помощью ILIKE или аналогичной функции в этом тексте с использованием индекса.

Функционально это работает, и это то, что я хотел бы сделать:

WITH ctr AS (
    SELECT id, jsonb_array_elements_text((content->>'text')::jsonb) as mytext
    FROM sample
)
SELECT id
FROM ctr
WHERE mytext ILIKE '%qui%';

 id 
----
  2
  2
  3
(3 rows)

Есть ли решение иметь тот же результат с использованием индекса? Я хочу запросить очень большой набор данных.

Похоже, что невозможно использовать индекс триграмм (ERROR: operator class "gist_trgm_ops" does not accept data type jsonb)

1 Ответ

0 голосов
/ 22 июля 2020

Вы можете использовать регулярные выражения

create index idx_name on sample ((content->>'text'));

select sample.*
from sample
where content->>'text' ~ ' qui';

select sample.* 
from sample, jsonb_array_elements_text(content->'text') many(elem)
where elem ~ ' qui';

Кроме того, начиная с Postgresql версии 12+, вы можете использовать like_regex для поиска в столбце JSONB.

https://www.postgresql.org/docs/current/functions-json.html

Проверить Выбор массива Jsonb содержит совпадение регулярных выражений и Как создать индекс для поля json в Postgres 9,3

...