```{toctree} ``` # Recherche de conventions La recherche de conventions est la page d'accueil d'APiLos. Elle permet de retrouver une convention selon différents critères. ## Principe de la recherche Pour effectuer une recherche, l'utlisateur remplit le formulaire en haut de la page `/recherche`. Après avoir complété le formulaire, la page de recherche va se recharger avec des query params supplémentaires dans l'url. Ces params sont des filtres qui vont être appliqués sur l'ensemble des conventions visibles pour l'utilisateur pour ne conserver que le résultat de la recherche. Exemple si on recherche un numéro de convention `1234` en staging, l'url de la page devient `https://siap-integration.apilos.beta.gouv.fr/conventions/recherche?order_by=&page=&search_operation_nom=&search_numero=1234&bailleur=&search_lieu=&cstatut=&financement=&date_signature=&nature_logement=`. La plupart des paramètres sont vides, mais on trouve `search_numero=1234`. Le résultat d'une recherche est ainsi matérialisé par une url, mais attention, les conventions sont préalablement filtrées selon les habilitations de l'utilisateur. Deux utilisateurs consultant la même url de recherche ne verront pas les mêmes résultats, mais les mêmes filtres seront appliqués à leurs conventions visibles. La logique de la recherche est située dans `conventions/services/search.py`. ## Liste des filtres disponibles | Champ du formulaire | Filtre (en query param) | | ------------------- |-------------| | Nom de l'opération | search_operation_nom | | Numéro de l'opération ou de la convention | search_numero | | Bailleur (nom ou SIREN) | bailleur | | Commune, code postal | search_lieu | | Statut convention ou avenant | cstatut | | Type de financement | financement | | Année de signature | date_signature | | Nature des logements | nature_logement | ## Ordre de la recherche L'ordre présenté à l'utilisateur inclut deux paramètres : le score et la date de création de la convention. Le score est déterminé par `_build_scoring`, qui normalise le ranking déterminé par `_build_ranking`. Différentes méthodes ont été testées empiriquement pour déterminer le ranking, des champs utilisent `TrigramSimilarity`, d'autres `SearchRank`. Le scoring rend comparable ces rankings obtenus par des méthodes différentes. ## Filtre via les habilitations L'échantillon de conventions sur lequel les filtres sont appliqués est obtenu par la méthode `conventions` du modèle User, qui se charge de réduire l'échantillon aux conventions visibles par l'utilisateur. En général quand un utilisateur se plaint de ne pas retrouver une convention dans la recherche, c'est lié à des données géographiques qui ne concordent pas entre la convention et les habilitations de l'utilisateur. (`code_insee_departement` incorrect sur la convention, par exemple) ## Variables d'environnement La variable d'environnement `DEBUG_SEARCH_SCORING` permet d'avoir plus d'informations sur la manière dont est déterminée le score. Elle est utile localement et en staging, mais n'est pas adaptée à l'environnement de production car elle s'applique pour tous les utilisateurs, et affiche des logs sur la page de recherche. `TRIGRAM_SIMILARITY_THRESHOLD` est une configuration qui permet de filtrer les résultats qui utilisent `TrigramSimilarity` qui ont un score trop faible. Si cette valeur est trop faible, la recherche affiche des résultats qui ont peu de pertinence, si elle est trop élevée elle n'autorise plus les fautes de frappes et imprécisions. La valeur par défaut a été expérimentalement placée à `0.3`.