Les STF ne prennent pas en charge LIKE
En réponse précédemment acceptée n'était pas correcte. Recherche en texte intégral avec ses index en texte intégral est pas pour les LIKE
Il a ses propres opérateurs et ne fonctionne pas pour les chaînes de caractères arbitraires. Il opère sur mots sur la base de dictionnaires et de troncs d'arbre. Il s'agit hace soutien correspondance des préfixes pour les mots mais pas avec le LIKE
de l'opérateur :
Indice de trigramme pour LIKE
Installer le module supplémentaire pg_trgm
qui fournit des classes d'opérateurs pour les Index des trigrammes GIN et GiST pour soutenir a LIKE
y ILIKE
modèles et pas seulement ceux qui sont ancrés à gauche :
Exemple d'index :
CREATE INDEX tbl\_col\_gin\_trgm\_idx ON tbl USING **gin** (col **gin\_trgm\_ops**);
Ou bien :
CREATE INDEX tbl\_col\_gist\_trgm\_idx ON tbl USING **gist** (col **gist\_trgm\_ops**);
Exemple de requête :
SELECT \* FROM tbl WHERE col LIKE 'foo%';
SELECT \* FROM tbl WHERE col LIKE '%foo%'; -- works with leading wildcard, too
SELECT \* FROM tbl WHERE col ILIKE '%foo%'; -- works case insensitively as well
Trigrammes ? Qu'en est-il des chaînes plus courtes ?
Mots avec moins de 3 lettres dans les valeurs indexées fonctionnent toujours. Le manuel :
Chaque mot est considéré comme ayant deux espaces préfixés et un espace lors de la détermination de l'ensemble des trigrammes contenus dans la chaîne.
Et les modèles de recherche de moins de 3 lettres ? Le manuel :
Pour les deux LIKE
et les recherches par expressions régulières, gardez à l'esprit qu'un sans trigrammes extractibles dégénérera en une recherche d'index complet.
Cela signifie que les balayages d'index / d'index bitmap fonctionnent toujours (les plans de requête pour les instructions préparées ne seront pas interrompus), mais qu'ils ne vous permettront pas d'obtenir de meilleures performances. En général, ce n'est pas une grosse perte, car les chaînes de 1 ou 2 lettres ne sont guère sélectives (plus de quelques pour cent des correspondances de la table sous-jacente) et la prise en charge de l'index n'améliorerait pas (beaucoup) les performances au départ, car un balayage complet de la table est plus rapide.
Correspondance des préfixes
Les modèles de recherche sans caractère générique en tête : col LIKE 'foo%'
.
^@
opérateur / starts_with()
fonction
Citant le notes de mise à jour de Postgres 11 :
Ajouter l'opérateur de correspondance de préfixe texte ^@ texte, qui est pris en charge par SP-GiST (Ildus Kurbangaliev)
Cette méthode est similaire à l'utilisation de var LIKE 'word%' avec un index btree, mais elle est plus efficace.
Exemple de requête :
SELECT \* FROM tbl WHERE **col ^@ 'foo'**; -- no added wildcard
Mais le potentiel de l'opérateur et de la fonction reste limité jusqu'à ce que La prise en charge des planificateurs est améliorée dans Postgres 15 et le ^@
est documenté correctement. Les notes de mise à jour :
Autoriser le ^@
et l'opérateur "start-with" et l'opérateur "start-with" et l'opérateur "start-with". starts_with()
à la fonction utiliser les index btree si l'on utilise la collation C (Tom Lane)
Auparavant, ces derniers ne pouvaient utiliser que des SP-GiST index.
COLLATE "C"
Depuis Postgres 9.1, un index avec COLLATE "C"
offre les mêmes fonctionnalités que la classe d'opérateurs text_pattern_ops
décrite ci-dessous. Voir aussi
text_pattern_ops
(réponse originale)
Pour seulement ancré à gauche (sans caractère générique), vous obtenez l'optimum avec une valeur de classe d'opérateurs pour un index btree : text_pattern_ops
o varchar_pattern_ops
. Ces deux fonctionnalités sont intégrées au système Postgres standard, aucun module supplémentaire n'est nécessaire. Performances similaires, mais index beaucoup plus petit.
Exemple d'index :
CREATE INDEX tbl\_col\_text\_pattern\_ops\_idx ON tbl(col **text\_pattern\_ops**);
Exemple de requête :
SELECT \* FROM tbl WHERE **col LIKE 'foo%'**; -- no leading wildcard
Ou si vous devez faire fonctionner votre base de données avec l'option 'C' locale (en fait no locale), tout est de toute façon trié selon l'ordre des octets et un simple index btree avec la classe d'opérateurs par défaut fait l'affaire.
Pour en savoir plus