Ceci peut être une question très simpliste, donc des excuses à l'avance, mais je suis très nouveau à l'utilisation de la base de données. Je souhaite que Postgres exécute sa recherche de texte intégral sur plusieurs tables jointes. Imaginez quelque chose comme un utilisateur modèle, avec les modèles connexes UserProfile et UserInfo. La recherche ne concernerait que les utilisateurs, mais inclurait des informations provenant de UserProfile et UserInfo.Postgres recherche de texte intégral à travers plusieurs tables connexes
Je prévois d'utiliser un index de gin pour la recherche. Cependant, je ne sais pas si je vais avoir besoin d'une colonne tsvector séparée dans la table User pour contenir les tsvectors agrégés à travers les tables, et pour configurer les triggers pour les maintenir à jour. Ou s'il est possible de créer un index sans une colonne tsvector qui se tiendra à jour chaque fois que l'un des champs pertinents dans l'une des tables pertinentes change. En outre, tous les conseils sur la syntaxe de la commande pour créer tout cela seraient également très appréciés.
Pouvez-vous entrer dans les détails sur le fonctionnement de la requête de lecture? J'essaie de trouver de la documentation sur la meilleure façon de faire de la recherche en texte intégral postgresql sur plusieurs tables et je ne trouve pas grand-chose. Un problème que j'ai rencontré est que si j'établis un index sur chacune des tables que j'interrogeais, postgresql n'était pas capable d'utiliser tous les index quand j'ai fait une requête. Comme: sélectionnez * à partir des commandes gauche rejoindre sur les utilisateurs ... gauche rejoindre sur line_items ... où ts_vector ('english', orders.id) @@ ... ou ts_vector ('english', users.name) @@. .. –
Je vois aussi qu'une recherche dans deux tables effectue une analyse séquentielle ('SELECT COUNT (*) FROM produits WHERE to_tsvector ('simple', products.name::text) @@ to_tsquery ('simple', 'foo ':: text); '), alors qu'une requête cherchant une table ne fait qu'un scan d'index bitmap en utilisant l'index (' SELECT COUNT (*) FROM produits LEFT JOIN marques ON products.brand_id = brands.id O WH to_tsvector (' simple ' , products.name::text) @@ to_tsquery ('simple', 'foo' :: text) OU to_tsvector ('simple', marques.name::text) @@ to_tsquery ('simple', 'foo' :: texte); – wvengen