PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 Re : Optimisation » Optimisation recherche plein texte like et vector » 18/09/2015 10:26:42

J'ai changé la clause LIKE comme m'a suggéré Rjuju mais ça ne change rien.

Donc il n'y a pas de solution pour mon problème ?

J'ai l'impression que c'est l'une des limites de la bdd, avec de gros volume de texte.

Je suis en train d'essayer de faire un tsquery puis un like dans le résultat que me retourne tsquery.. j'arrive à des résultats intéressant mais je peaufine encore.

#2 Re : Optimisation » Optimisation recherche plein texte like et vector » 17/09/2015 12:25:39

Voici la requête et le schéma, il n'y a pas d'index du tout..
43961_pgsql_sql.jpg
73087_pgsql_gin.jpg

Dans la maintenance de la table, j'ai juste fait un Analyse, pas de Vacuum car ça va être trop long et j'ai peur de faire tomber ma base, qui est en prod.

#3 Re : Optimisation » Optimisation recherche plein texte like et vector » 17/09/2015 10:40:39

D'accord, je comprends pour le % à gauche de l'expression.

Par contre la commande "create extension pg_trgm" me retourne le message suivant :
"la fonction « set_limit » existe déjà avec des types d'arguments identiques"

De plus, mon index est déjà en GIN. Il avait mis 15 minutes à créer l'index.

Est ce que j'ai fait ou oublié quelque chose ?

#4 Optimisation » Optimisation recherche plein texte like et vector » 16/09/2015 11:22:20

dangan
Réponses : 8

Bonjour à toutes et tous !

Après plusieurs recherche sur internet, je n'arrive pas à trouver de solution pour faire une recherche dans un texte, qui soit rapide et qui me rende des données sans approximation syntaxique.

Voici ma requête :

SELECT ir_inst_rech_entree FROM ir_instrument_document_recherche WHERE ir_inst_rech_doc_col2 like '% nouveau pont %' AND ir_inst_rech_doc_vecteur @@ to_tsquery('nouveau&pont')

Et la structure de ma table :

CREATE TABLE ir_instrument_document_recherche(
  id_ir_instrument_document_recherche integer NOT NULL DEFAULT nextval('ir_instrument_document_recher_id_ir_instrument_document_rec_seq'::regclass),
  ir_inst_rech_entree integer,
  ir_inst_rech_doc_col1 text,
  ir_inst_rech_doc_col2 text,
  ir_inst_rech_doc_vecteur tsvector,
  CONSTRAINT pk_ir_instrument_document_recherche PRIMARY KEY (id_ir_instrument_document_recherche)
)
WITH (OIDS=FALSE);

ALTER TABLE ir_instrument_document_recherche
OWNER TO postgres;

CREATE INDEX idx_inst_rech_doc_col2
  ON ir_instrument_document_recherche
  USING gin
  (ir_inst_rech_doc_col2 COLLATE pg_catalog."default" gin_trgm_ops);

CREATE INDEX idx_ir_instrument_document_recherche_vect
  ON ir_instrument_document_recherche
  USING gin
  (ir_inst_rech_doc_vecteur);

CREATE TRIGGER tg_inst_doc_recherche
  BEFORE INSERT OR UPDATE
  ON ir_instrument_document_recherche
  FOR EACH ROW
  EXECUTE PROCEDURE ir_update_recherche_document_vecteur();

Si j'enlève le like, ma requête se fait en 55ms, avec le like, plus de 60 secondes.
Sans le like je retrouve tout un tas d'approximation syntaxique, chose que je ne souhaite pas.

Comme montré dans la table, j'ai mis un index sur mon texte, mais lors de la procédure SQL l'index n'est pas du tout utilisé..


En vous remerciant d'avance de votre aide.

Pied de page des forums

Propulsé par FluxBB