create table item ( id bigint primary key, data jsonb ); create index idx_item_data on item using gin (data jsonb_path_ops); alter table item add column description_tsv tsvector generated always as ( to_tsvector('french', data->>'description') ) stored; create index idx_item_description_tsv on item using gin (description_tsv); alter table item add column search_tsv tsvector generated always as ( setweight(to_tsvector('french', coalesce(data->>'description', '')), 'A') || setweight(to_tsvector('french', coalesce(data->>'nom', '')), 'B') || setweight(to_tsvector('french', coalesce(data->>'categorie', '')), 'C') ) STORED; CREATE INDEX idx_item_search_tsv ON item USING gin (search_tsv); /* SELECT id, ts_rank(search_tsv, plainto_tsquery('french', 'miel lavande')) AS rank FROM item WHERE search_tsv @@ plainto_tsquery('french', 'miel lavande') ORDER BY rank DESC; */ truncate table item; DO $$ DECLARE f TEXT; BEGIN FOR f IN SELECT pg_catalog.pg_ls_dir('/tmp/json') LOOP IF right(f, 5) = '.json' THEN BEGIN RAISE NOTICE 'Import du fichier : %', f; INSERT INTO item (id, data) VALUES ( replace(f, '.json','')::bigint, pg_read_file('/tmp/json/' || f)::jsonb ) ON CONFLICT (id) DO UPDATE SET data = EXCLUDED.data; EXCEPTION WHEN OTHERS THEN RAISE WARNING 'Erreur lors de l''import du fichier % : %', f, SQLERRM; END; END IF; END LOOP; END; $$ LANGUAGE plpgsql;