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 25/07/2016 11:41:05

Postgres.0
Membre

Auto completion

Bonjour,

je cherche à faire de l'auto-complétion lors d'une insertion dans Postgres 9.5 à partir d'une application web (php).
J'ai regarder du côté de la recherche full texte, mais je n'ai pas trouvé grand chose.
Si quelqu'un peut m'aider ça serait top.


merci

Hors ligne

#2 25/07/2016 12:01:46

rjuju
Administrateur

Re : Auto completion

Bonjour,

À moins que vous n'ayez une question plus précise, je crains que personne ne puisse vous aider.

Hors ligne

#3 25/07/2016 14:40:04

Postgres.0
Membre

Re : Auto completion

Me dire que c'est possible, c'est déjà pas mal smile

Hors ligne

#4 25/07/2016 15:16:03

rjuju
Administrateur

Re : Auto completion

Je suppose que oui.

Hors ligne

#5 25/07/2016 15:36:13

Postgres.0
Membre

Re : Auto completion

Après avoir installer l'extension "unaccent", j'ai écrit une fonction qui enlève les accents et mets le mot en minuscule:

CREATE OR REPLACE FUNCTION simplify(text)
  RETURNS text AS
$BODY$
select lower(unaccent($1));
$BODY$
  LANGUAGE sql IMMUTABLE
  COST 100;

Ensuite j'ai rajouté une colonne tsvector que j'ai renseigné avec ma liste de commune (les noms des commune contiennent des accents)

ALTER TABLE maire ADD COLUMN commune_vector tsvector;

UPDATE maire SET commune_vector=to_tsvector(commune);

CREATE INDEX city_vector_idx ON film USING gin (commune_vector);

Le premier problème commence quand je fais une recherche avec la ville "chezery" je ne trouve rien

SELECT id_maire, commune FROM maire WHERE commune_vector  @@ to_tsquery('chezery');
 id_maire | commune 
----------+---------
(0 rows)

Alors que si je mets un accent, ça marche

SELECT id_maire, commune,commune_vector FROM maire WHERE commune_vector  @@ to_tsquery('Chézery');
 id_maire |    commune     |             commune_vector              
----------+----------------+-----------------------------------------
       58 | Chézery-Forens | 'chézery':2 'chézery-foren':1 'foren':3

cette situation
Justement, l'extension unaccent est sensée eviter  cela sad

Hors ligne

#6 25/07/2016 15:45:40

rjuju
Administrateur

Re : Auto completion

Vous n'utilisez nulle part votre fonction simplify. Je suppose qu'il faudrait plutôt faire :

UPDATE maire SET commune_vector=to_tsvector(simmplify(commune));

Il serait sinon plus simple de faire directement un index sur to_tsvector(simmplify(commune)) plutôt que de créer une colonne (qu'il faudrait maintenir avec des triggers).

Hors ligne

#7 25/07/2016 15:48:42

Postgres.0
Membre

Re : Auto completion

je suis parti sur l'idée de créer une autre table qui contient regexp_split_to_table(simplify(commune), E'\\s+')  avec une clef étrangère vers la table maire.

CREATE TABLE particule (
    id                     integer,
    atome              character varying,
    CONSTRAINT particule_id FOREIGN KEY (id)
      REFERENCES maire(id) ;
);

sauf que je serai obligé d'utiliser LIKE pour la completion de la  deuxième partie du nom de la commune, exemple:  "Chézery-Forens" c'est à dire Forens.
Et je n'ai aucun moyen de gérer la complétion de la première partie du nom de la commune c'est à dire  "Chézery"

Hors ligne

#8 25/07/2016 15:54:27

Postgres.0
Membre

Re : Auto completion

Merci pour ces conseils

Dernière modification par Postgres.0 (25/07/2016 15:55:35)

Hors ligne

#9 25/07/2016 15:54:52

rjuju
Administrateur

Re : Auto completion

Votre besoin est uniquement de faire l'autocomplétion de la liste des communes ? Vu le faible nombre d'enregistrements que cela doit représenter, pourquoi ne pas utiliser tout simplement un index avec pg_trgm sur simplify(commune), qui fonctionnerait avec des requêtes du type « commune ILIKE '%saisie%'; »

Hors ligne

#10 25/07/2016 15:58:45

Postgres.0
Membre

Re : Auto completion

Oui mon besoin pour le moment est de faire l'autocomplétion sur les communes de France, de mémoire 36000.
Mais j'aurai de l'autocomplétion à faire sur des tables de quelques millions de lignes qui contiennent des tweats

Hors ligne

#11 25/07/2016 15:59:54

Postgres.0
Membre

Re : Auto completion

L'index avec pg_trgm il est de type B-Tree?

Hors ligne

#12 25/07/2016 16:06:24

gleu
Administrateur

Re : Auto completion

Non, Gin ou Gist.


Guillaume.

Hors ligne

#13 25/07/2016 16:12:05

Postgres.0
Membre

Re : Auto completion

d'après ce que semble dire rjuju cela ne marche que si c'est une petite table.
Si quelqu'un a une piste pour une grosse table avec une colonne qui contient des millions de messages twitter, ça serait top

Hors ligne

#14 25/07/2016 16:30:06

gleu
Administrateur

Re : Auto completion

Ça marche aussi avec les grosses tables.


Guillaume.

Hors ligne

Pied de page des forums