Vous n'êtes pas identifié(e).
Pages : 1
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
Bonjour,
À moins que vous n'ayez une question plus précise, je crains que personne ne puisse vous aider.
Julien.
https://rjuju.github.io/
Hors ligne
Me dire que c'est possible, c'est déjà pas mal
Hors ligne
Hors ligne
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
Hors ligne
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).
Julien.
https://rjuju.github.io/
Hors ligne
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
Merci pour ces conseils
Dernière modification par Postgres.0 (25/07/2016 15:55:35)
Hors ligne
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%'; »
Julien.
https://rjuju.github.io/
Hors ligne
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
L'index avec pg_trgm il est de type B-Tree?
Hors ligne
Non, Gin ou Gist.
Guillaume.
Hors ligne
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
Ça marche aussi avec les grosses tables.
Guillaume.
Hors ligne
Pages : 1