|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
![]() ![]() Yoann MoreauIngénieur en laboratoire de recherche Inscription : septembre 2005 Messages : 723 ![]() |
Bonjour,
J'ai créé un index plein-texte de type GIN sur une colonne text, lorsque je fais des requêtes sur ce champ l'index n'est pas utilisé : Code :
Est-ce que j'ai loupé quelque chose dans la façon de créer l'index ou dans la requête qui devrait l'utiliser ? Merci d'avance |
||
|
00
|
|
|
#2 |
![]() ![]() Inscription : octobre 2008 Messages : 1 508 ![]() |
Pour être sûr, il faudrait faire ANALYZE de la table et aussi EXPLAIN ANALYZE au lieu de EXPLAIN.
|
|
|
00
|
|
|
#3 | |
![]() ![]() Yoann MoreauIngénieur en laboratoire de recherche Inscription : septembre 2005 Messages : 723 ![]() |
Je n'ai pas pensé à lancer un ANALYSE mais j'ai lancé la requête sans EXPLAIN et comme prévu elle a fait un parcours complet de la table en 2h... Je vais quand même la relancer.
Edit : comme je le soupçonnais l'index n'est pas utilisé, la requête vient de m'afficher des messages comme quoi des mots trop longs ne peuvent pas être indexés. J'ai eu ce même message quand j'ai créé l'index, donc j'en déduis qu'il reparcoure tout le texte à la volée pour obtenir les lexèmes. Citation:
|
|
|
00
|
|
|
#4 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 959 ![]() |
Normal... Une indexation textuelle, comme son nom l'indique est fait pour indexer des textes constitués de phrases avec des mots... Pas pour des flux de chaines ou des chaines binaires !
A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|
00
|
|
|
#5 | ||
![]() ![]() Yoann MoreauIngénieur en laboratoire de recherche Inscription : septembre 2005 Messages : 723 ![]() |
Mon champ text contient bien des mots, qui sont légèrement pollués par des erreurs de frappe et ou des concaténations suspectes, plus des termes techniques de mise en page non pertinents. Mais je n'ai eu ce warning de longueur que 3 ou 4 fois sur les 2,7 millions de documents (qui sont des articles wikipedia), pour le reste il s'agit de lexèmes valides et correctement "digérés" par les dictionnaires postgresql.
J'ai utilisé ts_debug() pour voir un peu ce que ça donnait. Ce qui m'interpelle c'est qu'il est écrit french_stem, or j'ai explicitement demandé un index en anglais à la création et dans la requête. Peut être qu'il faut être plus précis dans les options ? Il faudrait aussi que je désactive l'indexation des espaces et ponctuation, mais ça ne devrait pas perturber les requêtes à priori. Code :
|
||
|
00
|
|
|
#6 |
![]() ![]() Inscription : octobre 2008 Messages : 1 508 ![]() |
Es-tu sûr de la technique d'indexation que tu utilises, c'est-à-dire d'indexer le résultat de to_tsvector(), au lieu d'indexer une colonne supplémentaire de type tsvector contenant ce résultat?
|
|
|
00
|
|
|
#7 |
![]() ![]() Yoann MoreauIngénieur en laboratoire de recherche Inscription : septembre 2005 Messages : 723 ![]() |
J'ai suivi les examples de la doc, ils proposent deux façons de faire, créer un index ou générer une colonne contenant un ts_vector, j'ai choisi la 1ère qui me parait plus simple étant donné que je n'ai qu'un champ à indexer et pas un asssemblage de colonnes (titre+auteur+article par exp).
Comme dit au début, je l'ai fait avec cette requête : Code :
CREATE INDEX token_idx ON docs USING gin(to_tsvector('english', text)); Code :
CREATE INDEX token_idx ON docs USING gin(to_tsvector('english', text)); |
|
00
|
|
|
#8 | ||
![]() ![]() Inscription : octobre 2008 Messages : 1 508 ![]() |
En admettant que tu ne veuilles pas de colonne supplémentaire, je pense que la requête devrait être:
Code :
|
||
|
|
00
|
|
|
#9 | ||||
![]() ![]() Yoann MoreauIngénieur en laboratoire de recherche Inscription : septembre 2005 Messages : 723 ![]() |
J'avais lu dans la doc que la config devait être rigoureusement la même pour l'index et la requête, je pensais qu'en citant le champ seul il utiliserait l'index si le ts_query avait la même config. En explicitant comme tu le proposes ça fonctionne :
Code :
Code :
|
||||
|
00
|
Copyright © 2000-2012 - www.developpez.com