J'ai rencontré la recherche en texte intégral dans postgres au cours des derniers jours, et je suis un peu confus quant à l'indexation lors de la recherche sur plusieurs colonnes.
Les documents postgres parlent de la création d'un ts_vector
index sur des colonnes concaténées, comme ceci:
CREATE INDEX pgweb_idx ON pgweb
USING gin(to_tsvector('english', title || ' ' || body));
que je peux rechercher ainsi:
... WHERE
(to_tsvector('english', title||' '||body) @@ to_tsquery('english', 'foo'))
Cependant, si je voulais parfois rechercher uniquement le titre, parfois simplement le corps, et parfois les deux, j'aurais besoin de 3 index distincts. Et si j'ajoutais dans une troisième colonne, cela pourrait potentiellement être 6 index, et ainsi de suite.
Une alternative que je n'ai pas vue dans les documents est simplement d'indexer les deux colonnes séparément, puis d'utiliser simplement une WHERE...OR
requête normale :
... WHERE
(to_tsvector('english', title) @@ to_tsquery('english','foo'))
OR
(to_tsvector('english', body) @@ to_tsquery('english','foo'))
L'analyse comparative des deux sur environ 1 million de lignes semble n'avoir pratiquement aucune différence de performances.
Ma question est donc:
Pourquoi voudrais-je concaténer des index comme celui-ci, plutôt que d'indexer les colonnes individuellement? Quels sont les avantages / inconvénients des deux?
Ma meilleure supposition est que si je savais à l'avance, je ne voudrais que rechercher les deux colonnes (jamais une à la fois) Je n'aurais besoin que d'un index en concaténant qui utilise moins de mémoire.
title
dansbody
puis de l'indexation qui donnerait beaucoup de valeur, même si je suis ouvert à la correction. Je me contenterais probablement de les indexer séparément. De plus, si c'était une opération unique loufoque qui vous obligeait à concaténer, je suppose que vous pourriez simplement exécuter la requête ad hoc.