Installation d’un moteur de recherche pour du géocodage

Magazine
Marque
GNU/Linux Magazine
Numéro
189
|
Mois de parution
janvier 2016
|
Domaines


Résumé
Le géocodage c’est associer des coordonnées géographiques à une adresse. Cela permet de savoir avec précision où se situe l’adresse. Il faut donc avoir les adresses et un moyen de chercher dans cette énorme base de données.

Body


Dans ce court article, nous allons voir comment installer addok, un moteur de recherche d’adresses. Nous verrons ensuite où trouver les données et comment les mettre dans ce moteur de recherche. Il n’y aura ensuite plus qu’à lancer le service Web pour répondre aux requêtes.

1. Installation d’Addok

Il y a plus de 20 millions d’adresses dans la BANO, donc pour avoir des performances acceptables l’auteur a choisi d’utiliser Redis [2] qui est une base NoSQL qui stocke ses données en RAM. Cela implique que :

1. c’est rapide ;

2. ça consomme beaucoup de RAM.

Le reste du logiciel est développé en Python3 (le futur est arrivé \o/). Nous allons donc travailler dans un virtualenv.

On va installer les logiciels sur notre ubuntu 14.04 :

$ sudo apt-get install redis-server python3.4 python3.4-dev python-pip python-virtualenv virtualenvwrapper

On va se créer un dossier dans lequel on va faire notre tambouille :

$ mkdir ~/ban && cd ~/ban

On crée ensuite notre virtualenv qui va accueillir addok :

$ virtualenv addok --python=/usr/bin/python3.4

On active le virtualenv puis on installe addok :

$ source addok/bin/activate

$ pip install addok

Maintenant, addok devrait être installé.

2. Téléchargement des données

On va donc télécharger les données de la BANO. Je vous laisse choisir quelles données vous souhaitez avoir dans votre moteur de recherche, mais faites attention, plus on met de données, plus Redis va consommer de la mémoire vive. Pour toute la France, Redis a besoin de plus de 20 Gio de RAM.

Pour télécharger les données du département 14, on utilise la commande suivante :

$ wget http://bano.openstreetmap.fr/data/bano-14.json.gz

Notez que si vous voulez télécharger plusieurs départements, vous n’êtes pas obligé de taper plusieurs fois la commande, vous pouvez mettre les numéros entre accolades séparés par des virgules. Par exemple, pour télécharger les données de la Basse-Normandie, soit les départements 14, 50, et 61, on peut le faire comme ça :

$ wget http://bano.openstreetmap.fr/data/bano-{14,50,61}.json.gz

On décompresse le(s) fichier(s) téléchargé(s) et on met tout dans un fichier qu’on va importer :

$ gzip -d *gz

$ cat *json > data.json

2.1 Code INSEE

Il se peut que vous ayez besoin des codes INSEE des communes. Pour cela, il suffit de rajouter un fichier de configuration qu’on va appeler local.py. Dedans il suffit de mettre :

EXTRA_FIELDS = [

            {'key': 'citycode'},

            ]

FILTERS = ["type", "postcode", "citycode"]

Addok appelle le code INSEE « citycode » (c’est ce que vous devrez chercher dans le JSON contenant les réponses). Ensuite, on indique ce fichier à addok avec :

$ export ADDOK_CONFIG_MODULE=chemin/vers/le/fichier/local.py

Donc si local.py est dans le répertoire courant, il suffit de faire :

$ export ADDOK_CONFIG_MODULE=local.py

Lorsque vous lancerez les deux commandes suivantes, vous devriez avoir le message qui vous indique qu’il l’a bien pris en compte :

Loaded local config from local.py

3. Import des données

On va pouvoir importer les données maintenant que tout est en place :

$ addok batch data.json

Cela va mettre un petit moment, plus ou moins long suivant la quantité de données que vous lui faites ingérer. Vous allez aussi voir la quantité de RAM utilisée exploser. Pire que quand on lance du Java... enfin presque.

Pour les départements du 14, 50 et 61, la vm ubuntu qui me sert à vérifier l’intégralité des commandes que je donne consomme 994Mio de RAM.

Maintenant que les données sont dans Redis, on va calculer les n-gram [3]. Un n-gram est une partie de n éléments d’une suite de mots. Pour faire simple, c’est l’autocomplétion, c’est-à-dire que quand on lui donne « infant » il va nous proposer les adresses ayant le mot « infanterie ». Cette étape va prendre un peu de temps. :

$ addok ngrams

4. Lancement du service Web

On va lancer gunicorn qui va gérer les requêtes. Par défaut il écoute sur localhost ce qui n’est pas très pratique pour un serveur ; on surcharge donc cette adresse. Par défaut il écoute sur le port 8000 :

$ gunicorn addok.server:app --bind 0.0.0.0

On teste avec un navigateur en allant sur http://adresse-ip:8000/search/?q=Ville en remplaçant Ville par une ville présente dans les données que vous lui avez fournies. Dans mon cas, http://adresse-ip:8000/search/?q=Caen renvoie un fichier json avec toutes les informations qu’il trouve liées au mot Caen.

Maintenant, pour lancer gunicorn, le plus simple est d’écrire un script d’init pour que systemd (ou un autre init si vous êtes réticent au progrès :)) le lance au démarrage.

Conclusion

On vient donc d’installer un moteur permettant d’effectuer des recherches dans toutes les adresses que l’on souhaite, et ce très rapidement.

Références

[1] Dépôt Github d’addok : https://github.com/etalab/addok

[2] Page Wikipédia anglophone de Redis : https://en.wikipedia.org/wiki/Redis

[3] Page Wikipédia anglophone des n-gram : https://en.wikipedia.org/wiki/N-gram


Sur le même sujet

Neovim : dépoussiérez votre Vim

Magazine
Marque
Linux Pratique
HS n°
Numéro
47
|
Mois de parution
juillet 2020
|
Domaines
Résumé

Une application historique, puissante, populaire avec une base utilisateurs énorme, une compatibilité multiplateforme ultra-large, un code et une API quasi inmaintenables, dirigée par un Dictateur Bienveillant À Vie comme chef de projet et unique développeur : Vim présente toutes les caractéristiques d’un projet libre à succès. Et donc aussi tous les problèmes qui irritent ses utilisateurs et les contributeurs qui auraient le courage de participer à son développement. Dans cet article, nous allons découvrir Neovim, un fork de Vim né de la frustration d’utilisateurs de l’éditeur.

Collectez et exploitez les métriques de votre système avec Collectd

Magazine
Marque
Linux Pratique
HS n°
Numéro
47
|
Mois de parution
juillet 2020
|
Domaines
Résumé

Par défaut, votre système journalise dans différents fichiers les événements qui se passent vous permettant de déceler une activité anormale et autre plantage. Mais vous avez aussi besoin de collecter des métriques de votre système et de ses applications, et de générer les graphiques associés. Car c’est seulement grâce à ces données et graphiques que vous pourrez faire de l’analyse de performance pour détecter les goulots d’étranglement, ou faire de la gestion de capacité en prédisant la future charge système. Un des moyens les plus simples de collecter des données d’un serveur est d’utiliser le démon Collectd.

Hébergement privé de dépôts Git

Magazine
Marque
GNU/Linux Magazine
HS n°
Numéro
109
|
Mois de parution
juillet 2020
|
Domaines
Résumé

Nous allons voir comment mettre en place un hébergement de dépôts Git privé indépendant et évolutif, avec seulement trois containers. Cela comprendra une interface web, la possibilité de gérer plusieurs utilisateurs, organisations et leurs dépôts, qu’ils soient privés ou publics.

Cluster et orchestration de conteneurs avec Docker Swarm

Magazine
Marque
Linux Pratique
HS n°
Numéro
47
|
Mois de parution
juillet 2020
|
Domaines
Résumé

Cet article prolonge mon précédent article [1] et parle de la capacité à introduire de la haute disponibilité dans les environnements de conteneurs Docker, critère indispensable pour pouvoir utiliser ces technologies jusqu’à la production, ceci au travers de la notion de cluster et d’orchestration de conteneurs.

Introduction au dossier : Déployez votre système de supervision

Magazine
Marque
Linux Pratique
HS n°
Numéro
47
|
Mois de parution
juillet 2020
|
Domaines
Résumé

Technique à ne pas négliger, la supervision va permettre de s’assurer du bon fonctionnement de votre système. La mise en place d’une supervision permet ainsi à tout administrateur d’être alerté en cas de problème, d’avoir à l’œil un suivi de son infrastructure, ses machines, son réseau... et d’agir ainsi au plus vite en cas de dysfonctionnement, en s’étant informé un maximum en amont par le biais de logs et rapports d’activités.

Par le même auteur

Service de calcul d'itinéraire

Magazine
Marque
GNU/Linux Magazine
Numéro
189
|
Mois de parution
janvier 2016
|
Domaines
Résumé
Il peut être très utile de savoir comment se rendre d'un point A à un point B. C'est encore plus utile quand on connaît le temps de trajet estimé. Installons ça chez nous.

Installer son propre serveur de tuiles

Magazine
Marque
GNU/Linux Magazine
Numéro
188
|
Mois de parution
décembre 2015
|
Domaines
Résumé
D'un côté, le projet OpenStreetMap (ou OSM) fournit des données, de l'autre il y a les différentes cartes. Qu'y a-t-il entre les deux ? Le serveur de tuiles ! Et si on en installait un ?

Le nouveau système de queueing de Packet Filter

Magazine
Marque
GNU/Linux Magazine
HS n°
Numéro
74
|
Mois de parution
septembre 2014
|
Domaines
Résumé
Si vous avez déjà joué avec un BSD, vous devez certainement connaître (et apprécier) Packet Filter (PF), le firewall développé sur OpenBSD. Si ce n'est pas le cas, on a déjà sûrement dû vous en vanter la syntaxe claire par rapport à celle incompréhensible d'iptables (certes, au bout de la 15ème fois qu'on utilise une commande, on commence à se rappeler à quoi sert l'obscure option -machin). Mais quid du queueing avec PF ?