-
Notifications
You must be signed in to change notification settings - Fork 31
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[Optimisation] Route allnamebylist dans la recherche par nom "search_name" #384
Comments
Concernant cette recherche avait pas mal creusé le volet pertinence détaillé ici - https://si.ecrins-parcnational.com/blog/2019-01-fuzzy-search-taxons.html Sur les performances et propositions, je ne sais pas. |
Merci pour cet article très intéressant @camillemonchicourt (merci @TheoLechemia par la même occasion !) L'objectif n'est pas de modifier le fonctionnement mais plutôt de l'optimiser. En effet, en testant "ibex" on a une inversion de quelques suggestions mais pas les 3 premières : Actuellement (demo.geonature.fr) : Honnêtement, il n'est pas possible de déterminer celui qui a raison ici. |
On vient de creuser un peu avec Maxime. Le nouvel index est vraiment performant. |
Je ne me souviens plus comment on met à jour cette VM et à quelle fréquence. |
A mon avis, il faut la mettre à jour à chaque mise à jour de Taxref donc pour le temps de génération c'est pas grand chose face à l'expérience utilisateur à mon avis. La question ici est : vaut-il mieux ajouter une colonne ou créer une fonction En faisant confiance aux 👍, je fais une PR avec la solution de @TheoLechemia Merci à vous ! |
La VM est uniquement créée à l'installation de la BDD, et à la MAJ de Taxref. C'est une copie de Taxref remise en forme pour les besoin de la recherche |
Intégré dans la 1.11.2. |
Salut !
Dans le cadre d'une prestation avec l'Agence Régionale de la Biodiversité en île de France, un problème de performance a été noté sur la recherche de taxon dans Occtax. Cette recherche s'appuie sur la route
/allnamebylist
avec utilisation d'unquery_string
"search_name".État des lieux
Cette route appelle la vue matérialisée
taxonomie.vm_taxref_list_forautocomplete
et un appel à cette route du typehttps://demo.geonature.fr/taxhub/api/taxref/allnamebylist?search_name=lynx
génère la requête SQL suivante :Analyse
Avertissement : je ne suis pas un pro de SQL, je vous écris ce que j'ai compris mais il est possible que j'écrive des grosses bêtises, n'hésitez surtout pas à me corriger si c'est le cas !
Avec un simple
EXPLAIN
, Cette requête prend du temps dans le ILIKE avec le unaccent (Parallel Seq Scan) :Après analyse de la requête de la vue matérialisée et quelques recherches, il s'avère que l'index suivant ne permet pas d'assez optimiser la requête :
Potentielle solution
Après recherches sur les types d'index possibles il s'avère que l'index de type GIN est plus performant que le GiST mais est plus long à mettre à jour. Donc GIN est parfait pour les données statiques comme c'est le cas ici : https://www.postgresql.org/docs/9.1/textsearch-indexes.html
Puisqu'on utilise
unaccent
, il faudrait à mon avis le mettre dans l'index du "search_name" directement. Le soucis c'est qu'unnaccent
doit être rendu immutable (si j'ai bien compris). Donc, selon stackoverflow, il faut générer une fonctionf_unnaccent
comme ceci :Enfin le nouvel index devient :
Et les performances sont incomparables :
Et la recherche sur occtax est beaucoup plus agréable avec des temps d'une quinzaines de millisecondes contre 1-2 secondes voire plus.
J'ai effectué plusieurs essais, et ça retourne les mêmes résultats mais il faudrait trouver un moyen de valider que cela retourne bien tout le temps les mêmes résultats.
Désolé pour le long roman...
Si ça vous convient, je peux faire une PR et en attendant, n'hésitez pas à me dire ce que vous en pensez !
Bonus : la lecture qui m'a bien aidé : https://www.cybertec-postgresql.com/en/postgresql-more-performance-for-like-and-ilike-statements/
The text was updated successfully, but these errors were encountered: