web-dev-qa-db-fra.com

Comment puis-je utiliser une recherche en texte intégral sur une colonne jsonb avec Postgres?

J'ai donc une colonne jsonb qui contient des entrées comme celle-ci: https://Pastebin.com/LxJ8rKk4

Existe-t-il un moyen d'implémenter une recherche en texte intégral sur toute la colonne jsonb?

13
choco

PostgreSQL 10+

PostgreSQL 10 introduit la recherche en texte intégral sur JSONB

CREATE INDEX ON table
   USING gin ( to_tsvector('english',jsondata) );

La nouvelle indexation FTS sur JSON fonctionne avec la recherche de phrases et ignore à la fois le balisage JSON et les clés.

15
Evan Carroll

Vous pouvez, bien que ce ne soit pas si clair:

CREATE TABLE t
(
    id SERIAL PRIMARY KEY,
    the_data jsonb
) ;

CREATE INDEX idx_t_the_data_full_text 
    ON t 
    USING Gist ( (to_tsvector('English', the_data::text))) ;

Et puis interrogez-le avec:

SELECT
    the_data
FROM
    t
WHERE
    to_tsvector('English', the_data::text) @@ plainto_tsquery('English', 'Action') ;

Notez que cela trouvera également toutes les clés de votre objet , pas seulement les valeurs . Et vous serez limité à la quantité de texte

dbfiddle ici

3
joanolo