Учитывая следующий набор данных:
-- 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
)