Je crée un logiciel de forum personnalisé pour un site que je consomme, qui comprend 2 tables (qui sont pertinentes pour cette question): Voici les structures de table de base avec les colonnes correspondantes à ma question: p> sujets code> et
messages code>. Un message appartient à un sujet et le sujet contient le sujet, tandis que chaque message contient le corps.
ALTER TABLE topics ADD COLUMN topics_vector tsvector NOT NULL;
CREATE TRIGGER topics_ins BEFORE INSERT OR UPDATE ON topics FOR EACH ROW EXECUTE PROCEDURE tsvector_update_trigger(title_vector, 'pg_catalog.english', title);
CREATE INDEX topics_title_idx ON topics USING gin(title_vector);
ALTER TABLE posts ADD COLUMN posts_vector tsvector NOT NULL;
CREATE TRIGGER posts_ins BEFORE INSERT OR UPDATE ON posts FOR EACH ROW EXECUTE PROCEDURE tsvector_update_trigger(body_vector, 'pg_catalog.english', body);
CREATE INDEX posts_body_idx ON posts USING gin(body_vector);
3 Réponses :
Prétendre qu'il y a 20 nouveaux sujets & 100 nouveaux messages par jour. Qui ferait tu choisis? Et si le nombre de Thèmes / Postes par jour Voice deux fois ça? Cinq fois ça? Dix fois? Est-ce que ton décision d'un contre l'autre changement? p> blockQuote>
C'est environ 36 000 messages par an. Peu importe. Peu importe peu d'importance avec dix fois cela, même sur une machine bon marché. P>
Cependant, vous pouvez souhaiter une table troisième em> contenant un TSVector explicite combinant sujet et texte de corps ensemble. Vous pouvez ensuite utiliser le système de pondération intégré et exécuter une recherche pour fournir le type de recherche que les gens attendent généralement sur des forums, etc. qui signifieront écrire des déclencheurs personnalisés pour mettre à jour votre TSVector lors de la modification de la table source. P>
Normalement, j'irais avec stocker le Tsvector dans un champ, car cela vous donnera également un accès utilisable aux éléments tels que le titre () et le rang (). P>
Utilisation d'une option Le Vous devez simplement modifier la syntaxe de requête: p> dans le premier cas ou p> Vous pouvez probablement économiser un peu de temps lors de l'utilisation de Gin code> index sera utilisé, que vous ayez créé sur une colonne instanciée ou une expression calculée. p>
TS_RANK code> sur la colonne instanciée. P> P>
Hmm, peut-être que j'ai mal interprété quelque chose dans le manuel, car j'ai laissé l'impression qu'il serait plus rapide de faire quelque chose comme l'option 2.
Si vous effectuez des opérations avec le tts_vector code> lui-même, comme
tts_rank code>, puis option
2 code> sera plus rapide. Si vous utilisez uniquement
tts_vector code> pour la recherche, la performance sera la même. La colonne persistée ne sera même pas référencée par l'optimiseur.
Bon à savoir. Je vais vouloir trier par rang, donc je finirai probablement à utiliser l'option 2. Merci!