Aller au contenu principal

Moteur de recherche

Certains produits auront peut-être besoin d'un outil lourd comme ElasticSearch pour stocker et optimiser les recherches à effectuer, mais encore une fois, dans la grande majorité des cas votre PostgreSQL suffira.

Nous ne vous proposons quand même pas de retourner à l'opérateur SQL LIKE %ma recherche% 👵, mais plutôt d'utiliser les types de données tsquery et tsvector. Si comme conseillé vous utilisez l'ORM Prisma, l'utilisation est assez facile et quasi transparente sur des colonnes distinctes. Par contre cela ne marchera pas si vous cherchez "John Doe" et que "John" est dans la colonne firstname et "Doe" dans la colonne lastname.

Pour faire ce type de recherche sur plusieurs colonnes (exemple : le prénom, le nom, l'adresse, la biographie), la stratégie est de concaténer chaque colonne voulue dans une colonne générée et indexée, représentant un tsvector. Cette colonne est donc optimisée pour de la recherche.

Prisma ne gère pas encore nativement les colonnes générées, mais rien ne vous empêche de la créer à la main. Différents articles existent sur internet mais pour vous donner une idée cela donnerait quelque chose comme :

ALTER TABLE MyTable
ADD search TSVECTOR
GENERATED ALWAYS AS (
to_tsvector('english',
firstname || ' ' || lastname || ' ' || biography || ' ' || full_address
)
) STORED;

Plutôt que de juste concaténer bêtement les colonnes, on transforme le tout en tsvector afin qu'il soit déjà optimisé pour la recherche.

À savoir

Un tsvector est optimisé pour une langue en particulier afin de trier les mots. Par défaut, c'est la configuration default_text_search_config qui est utilisée. Sachez que même si votre contenu est en français, faites des tests avec english avant d'utiliser la valeur french. Cette dernière différencie les mots avec ou sans accent, ce qui peut être problématique… N'hésitez pas à jeter un œil à toutes les options de langues possibles.