Projet

Général

Profil

Optimisation auto-complétion espèce usuelle » Historique » Version 2

Ludovic Lestrat, 26/04/2018 12:45

1 1 Ludovic Lestrat
L'auto-complétion lors de la saisie d'une espèce usuelle peut prendre jusqu'à une dizaine de seconde. Pour y pallier, voici comment procéder
2
3
4 2 Ludovic Lestrat
h2. Réindexation GIST en base
5 1 Ludovic Lestrat
6
Supprimer à la main tous les index de ta table inpn.taxref et les recréer avec les commandes ci-dessous :
7
8
<pre>
9
CREATE INDEX classe_ind ON inpn.taxref USING gist (classe COLLATE pg_catalog."default" gist_trgm_ops);
10
CREATE INDEX famille_ind ON inpn.taxref USING gist (famille COLLATE pg_catalog."default" gist_trgm_ops);
11
CREATE INDEX lb_nom_ind ON inpn.taxref USING gist (lb_nom COLLATE pg_catalog."default" gist_trgm_ops);
12
CREATE INDEX nom_complet_ind ON inpn.taxref USING gist (nom_complet COLLATE pg_catalog."default" gist_trgm_ops);
13
CREATE INDEX nom_vern_ind ON inpn.taxref USING gist (nom_vern COLLATE pg_catalog."default" gist_trgm_ops);
14
CREATE INDEX ordre_ind ON inpn.taxref USING gist (ordre COLLATE pg_catalog."default" gist_trgm_ops);
15
CREATE INDEX phylum_ind ON inpn.taxref USING gist (phylum COLLATE pg_catalog."default" gist_trgm_ops);
16
CREATE INDEX regne_ind ON inpn.taxref USING gist (regne COLLATE pg_catalog."default" gist_trgm_ops);
17
CREATE INDEX taxref_cd_nom_idx ON inpn.taxref USING btree (cd_nom COLLATE pg_catalog."default");
18
CREATE INDEX taxref_cd_ref_idx ON inpn.taxref USING btree (cd_ref COLLATE pg_catalog."default");
19
20
</pre>
21
22 2 Ludovic Lestrat
h2. Remplacement de la fonction UNACCENT en base
23 1 Ludovic Lestrat
24
La fonction unnacent ne permet pas d'utiliser l'index car on ne peut indexer le résultat d'une fonction qui n'est pas immutable.
25
On va donc créer une alias de la function unaccent, qui sera immutable : 
26
27
<pre>
28
CREATE OR REPLACE FUNCTION f_unaccent(text)
29
RETURNS text AS
30
$func$
31
SELECT public.unaccent('public.unaccent', $1)  -- schema-qualify function and dictionary
32
$func$  LANGUAGE sql IMMUTABLE;
33
</pre>
34
35
Puis nous indexons le résultat de cette fonction pour la colonne _nom_vern_ sur laquelle s'applique la recherche.
36
37
<pre>
38
CREATE INDEX nom_vern_unaccent_ind
39
ON inpn.taxref
40
USING gist
41
(f_unaccent(nom_vern) COLLATE pg_catalog."default" gist_trgm_ops);
42
</pre>
43
44 2 Ludovic Lestrat
h2. Remplacement de la fonction UNACCENT dans le script
45 1 Ludovic Lestrat
46
Dans le fichier jEspecesUsuelles.php ( dossier ./Sources/Modeles/Json/), nous remplaçons la fonction _unnacent_ par la nouvelle fonction _f_unaccent_ et supprimons l'utilisation de la fonction splitpart devenue inutile.
47
48
<pre>
49
UNACCENT(split_part(nom_vern, ' ', 1)) ILIKE UNACCENT('%" . $critere . "%')
50
</pre>
51
52
devient 
53
<pre>
54
f_unaccent(nom_vern) ILIKE UNACCENT('%" . $critere . "%')
55
</pre>
56
57
Remplacement à effectuer sur 3 lignes de code, cf https://github.com/mathieubossaert/obs_occ/commit/7b6bb6d472e81c864a64b5d68b6caff19089db23#diff-89b0f17c68eb036282241881ff50b777