11
votes

Indice TSVector dynamique ou colonne-ized?

Je crée un logiciel de forum personnalisé pour un site que je consomme, qui comprend 2 tables (qui sont pertinentes pour cette question): sujets code> et messages code>. Un message appartient à un sujet et le sujet contient le sujet, tandis que chaque message contient le corps.

Voici les structures de table de base avec les colonnes correspondantes à ma question: p>

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);


0 commentaires

3 Réponses :


5
votes

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?

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é.

Cependant, vous pouvez souhaiter une table troisième 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.


0 commentaires

4
votes

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 ().


0 commentaires

8
votes

Utilisation d'une option 1 ne fera pas vos recherches plus lentes.

Le Gin index sera utilisé, que vous ayez créé sur une colonne instanciée ou une expression calculée.

Vous devez simplement modifier la syntaxe de requête: xxx

dans le premier cas ou xxx < P> Dans le second cas.

Vous pouvez probablement économiser un peu de temps lors de l'utilisation de TS_RANK sur la colonne instanciée.


3 commentaires

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 lui-même, comme tts_rank , puis option 2 sera plus rapide. Si vous utilisez uniquement tts_vector 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!