JDONREFv4 Mappings : Différence entre versions
(→Champs "obligatoires") |
(→Champs "obligatoires") |
||
Ligne 136 : | Ligne 136 : | ||
|- |
|- |
||
| numero |
| numero |
||
− | | optionnel |
||
+ | | |
||
| obligatoire |
| obligatoire |
||
| |
| |
||
Ligne 145 : | Ligne 145 : | ||
|- |
|- |
||
| repetition |
| repetition |
||
− | | optionnel |
||
+ | | |
||
| optionnel |
| optionnel |
||
| |
| |
||
Ligne 153 : | Ligne 153 : | ||
|- |
|- |
||
| type_de_voie, article, libelle |
| type_de_voie, article, libelle |
||
− | | optionnel |
||
+ | | |
||
| au moins 1 |
| au moins 1 |
||
| au moins 1 |
| au moins 1 |
Version du 12 novembre 2014 à 11:03
JDONREFv4 introduit différents mapping permettant de gérer des adresses.
C'est le POI ou la Zone qui dispose de la plus grande richesse d'information, mais les autres mappings peuvent disposer d'informations qui leurs sont propres (notamment leur géométrie).
Ils sont fournis dans le plugin sous la forme de fichiers json.
Sommaire
Quelques informations à lire avant de commencer
Les mappings proposés dans cette page ne sont pas obligatoire pour travailler avec la requête JDONREF (voir définir son propre mapping). Toutefois, si vous débutez avec elasticsearch, il sera sans doute plus simple de commencer avec les mappings fournis.
Le mapping du type "poizon" peut être appliqué à tous les types, car il est le plus générique (si un champ n'est pas utilisé, cela ne prend pas de place). Toutefois, pour plus de lisibilité, les mappings de chaque type sont fournis de manière allégée.
Les mappings qui suivent disposent aussi de quelques particularités à connaître pour leur bonne lecture.
- JDONREFv4 se sert d'un unique champ pour sa recherche, mais les mappings proposés le construit à partir des champs stockés (store:true). Il est donc important de respecter le nom de ces champs. requête. Les autres sont aussi généralement associés à une adresse mais ne lui sont pas indispensables.
- Le respect du type est nécessaire pour le bon usage de la requête. Ils permettent un calcul de règles métier associées à chaque type.
- Le champ 'codes' est un champ calculé à partir d'autres. Il n'est donc pas nécessaire de l'alimenter en donnée, il va les piocher dans code_postal, code_departement, ... L'attribut copyTo est utilisé à cet effet.
- Le champ 'fullName' est lui aussi calculé à partir de l'ensemble des champs indexés concernant une adresse. C'est sur ce champ qu'est calculé la requête. Il s'appuie sur l'attribut "transform" pour sa construction.
- La plupart des champs ne sont pas stockés dans l'index, mais peuvent toujours être obtenus au travers du champ spécial _source (hormis la géométrie). Cela permet d'alléger le poids de l'index.
- Le champ géométrie est exclus du champ _source pour éviter de surcharger la base. Les géométries des communes sont particulièrement gourmandes. Leur géométrie n'est donc pas du tout accessible (ni même en spécifiant le champ), mais uniquement utilisée à titre de requêtage spatial (topologique). Par contre, une géométrie "pin" est conservée comme géocodage au centroïde et toujours présent dans le champ _source (et lui aussi requêtable).
- Les champs qui sont marqués "index":"not_analyzed" peuvent être utilisés dans des requêtes avec des valeurs brutes (ils ne sont pas analysés). Cela semble pertinent pour les codes, les identifiants, tout ce qui n'est pas du langage naturel en somme. Dans un champ comme "ligne4", la distinction des termes ne pourra donc pas être réalisée.
- Vous pouvez bien sûr ajouter autant de champs que vous le souhaitez, construire des requêtes avec, ... la requête jdonrefv4 n'est qu'un outil comme un autre !
Glossaire
Les champs utilisés dans chacun des mappings sont décrit dans ce tableau. Même si la plupart des informations qu'il présente sont évidente, ce tableau m'a été demandé. Il permet de lever l'ambiguité sur l'usage de certain terme de manière synthétique. Il reprend aussi par conséquent tous les champs du mapping poizon.
Tous ces champs peuvent ne pas être remplis ! Par contre, si les mappings proposés sont utilisés, il faut respecter leur orthographe.
terme | description |
poizon_id | identifiant métier du poi ou de la zone considéré |
adr_id | identifiant métier de l'adresse (du poi ou de la zone, lorsqu'il s'agit d'un poi ou d'une zone) |
tro_id | identifiant métier du troncon (auquel appartient l'adresse, lorsqu'il y a une adresse) |
voi_id | identifiant métier de la voie (auquel appartient le troncon, lorsqu'il y a un troncon) |
code_insee | code insee de la voie |
code_insee_commune | code insee de la commune au cas où code insee représente un arrondissement |
code_postal | code postal de la voie |
code_departement | code du département où se situe l'adresse, la voie, le troncon, le poi ou la zone ... |
code_pays | code du pays où se situe le département, la commune, l'adresse, la voie, le troncon, le poi ou la zone ... |
codes | Il s'agit d'un champ calculé qui contient tous les codes qui permettent de trouver une commune (du département au code postal, en passant par le code insee, d'arrondissement, ou de la commune) |
code_arrondissement | code de l'arrondissement si cette notion existe |
numero | numero de l'adresse |
repetition | BIS, TER, QUATER, QUINQUIES, A, B, C, ... |
type_de_voie | RUE, BOULEVARD, ... le type de voie de l'adresse ou de la voie |
article | le petit article qui se trouve entre le type de voie et le libelle. Comme dans BOULEVARD DE L HOPITAL : "DE L". |
libelle | le libelle complet de la voie (sans article) |
commune | lol |
pays | généralement FRANCE, mais le type pays permet de tous les indexer |
t0 et t1 | respectivement le début (inclus) et la fin (exclus) de validité de l'adresse |
poizon_service | les poi et les zones sont généralement décomposés en plusieurs entités. Il pourrait très bien s'agir de type elasticsearch, mais j'ai pour le moment choisi de les distinguer dans ce champ. |
ligne 1, ligne2, ligne3, ... | les lignes au sens de la norme postale. Seule la ligne1 et la ligne7 est utilisée actuellement dans le mapping (sans doute la ligne3 à l'avenir). Les autres champs sont donc laissés pour information, et disponible dans les résultats dans le champ _source. |
pin | généralement le centroïde de l'objet considéré |
geometrie | la géométrie exacte de l'objet considéré. Elle est confondu avec le pin pour les ponctuels. Elle n'est pas stockée, mais indexée pour les requêtes topologiques. |
fullName | ce champ est calculé à partir des autres pour permettre une recherche sur une seule ligne. Le champ "transform" est utilisé à cet effet. |
Champs "obligatoires"
Aucun champ n'est réellement obligatoire dans le sens où s'il est absent il n'est simplement pas pris en compte. Toutefois, il reste important de savoir quels champs sont réellement utiles ou pas.
Le tableau qui suit présente les informations qui sont actuellement utilisées par la requête jdonrefv4 via le champ "transform". Ces informations varient suivant le type concerné.
terme | poizon | adresse | voie | commune | departement | pays | |
ligne1,numero, repetition, type_de_voie, article, libelle | au moins 1 | ||||||
numero | obligatoire | ||||||
repetition | optionnel | ||||||
type_de_voie, article, libelle | au moins 1 | au moins 1 | |||||
code_postal, code_insee, code_departement, code_arrondissement, commune | optionnel | au moins 1 | au moins 1 | au moins 1 | |||
code_departement | obligatoire | ||||||
ligne7 | optionnel | optionnel | optionnel | optionnel | optionnel | obligatoire | |
code_pays | inutilisé | inutilisé | inutilisé | inutilisé | inutilisé | inutilisé |
Le mapping poizon
Un POIZON est un POI (point d'intérêt) ou une Zone (géographique). Leur géométrie est différente : un POI est un point, tandis qu'une zone est généralement un polygone (ou multi-polygone). Le type geo_shape est alors employé pour leur géométrie commune. Son mapping est défini de la manière suivante :
$ curl -XPUT 'http://localhost:9200/jdonref/poizon/_mapping' -d '{ "poizon": { "_type": {"store": true}, "_source": {"excludes": ["geometrie"]}, "properties" : { "poizon_id" : { "type" : "string", "index":"not_analyzed"}, "adr_id" : { "type" : "string", "index":"not_analyzed"}, "tro_id" : { "type" : "string", "index":"not_analyzed"}, "voi_id" : { "type" : "string", "index":"not_analyzed"}, "code_insee" : { "type" : "string", "index":"not_analyzed", "copy_to": ["codes"]}, "code_insee_commune" : { "type" : "string", "index":"not_analyzed", "copy_to": ["codes"]}, "code_departement" : { "type" : "string", "index":"not_analyzed", "copy_to": ["codes"]}, "code_pays" : { "type" : "string" , "term_vector" : "with_positions_offsets", "index_analyzer":"jdonrefv4_codes_index","search_analyzer":"jdonrefv4_search", "similarity":"jdonrefv4"}, "codes" : { "type" : "string", "term_vector" : "with_positions_offsets", "index_analyzer":"jdonrefv4_codes_index","search_analyzer":"jdonrefv4_search", "similarity":"jdonrefv4"}, "numero" : { "type" : "integer", "index":"not_analyzed"}, "repetition" : { "type" : "string", "index":"not_analyzed"}, "type_de_voie" : { "type" : "string", "index":"not_analyzed"}, "article" : { "type" : "string", "index":"not_analyzed"}, "libelle" : { "type" : "string", "index":"not_analyzed"}, "commune" : { "type" : "string" , "term_vector" : "with_positions_offsets", "index_analyzer":"jdonrefv4_index","search_analyzer":"jdonrefv4_search", "similarity":"jdonrefv4"}, "code_arrondissement" : { "type" : "string", "index":"not_analyzed", "copy_to": ["codes"]}, "code_postal" : { "type" : "string", "index":"not_analyzed", "copy_to": ["codes"]}, "pays" : { "type" : "string" , "index": "no"}, "t0" : { "type" : "date", "format": "YYYY-MM-dd HH:mm:ss", "index":"not_analyzed"}, "t1" : { "type" : "date", "format": "YYYY-MM-dd HH:mm:ss", "index":"not_analyzed"}, "poizon_service" : { "type" : "integer", "index":"not_analyzed"}, "ligne1" : { "type" : "string", "term_vector" : "with_positions_offsets", "index_analyzer":"jdonrefv4_index","search_analyzer":"jdonrefv4_search", "similarity":"jdonrefv4"}, "ligne2" : { "type" : "string", "index":"no"}, "ligne3" : { "type" : "string", "index":"no"}, "ligne4" : { "type" : "string", "term_vector" : "with_positions_offsets", "index_analyzer":"jdonrefv4_index","search_analyzer":"jdonrefv4_search", "similarity":"jdonrefv4"}, "ligne5" : { "type" : "string", "index":"no"}, "ligne6" : { "type" : "string", "index": "no"}, "ligne7" : { "type" : "string", "term_vector" : "with_positions_offsets", "index_analyzer":"jdonrefv4_index","search_analyzer":"jdonrefv4_search", "similarity":"jdonrefv4"}, "pin" : { "properties" : { "centroide" : { "type" : "geo_point" , "fielddata" : { "format" : "compressed" , "precision" : "1cm"}}}}, "geometrie" : { "type" : "geo_shape", "precision": "1cm", "tree": "quadtree"}, "fullName" : {"type": "string", "term_vector" : "with_positions_offsets_payloads", "index_analyzer":"jdonrefv4_index_token_count","search_analyzer":"jdonrefv4_search", "similarity":"jdonrefv4"} }, "transform" : { "lang" : "groovy", "script" : "ctx._source['fullName'] = ; if (ctx._source['ligne7']!=null) { def tokens = ctx._source['ligne7'].split(' '); for(x in tokens) ctx._source['fullName'] += ' ' + x + '|9'; }; if (ctx._source['code_pays']!=null) { def tokens = ctx._source['code_pays'].split(' '); for(x in tokens) ctx._source['fullName'] += ' ' + x + '|10'; }; if (ctx._source['code_departement']!=null) { def tokens = ctx._source['code_departement'].split(' '); for(x in tokens) ctx._source['fullName'] += ' ' + x + '|8'; }; if ( ctx._source['code_insee']!=null) { def tokens = ctx._source['code_insee'].split(' '); for(x in tokens) ctx._source['fullName'] += ' ' + x + '|7'; }; if (ctx._source['code_insee_commune']!=null) { def tokens = ctx._source['code_insee_commune'].split(' '); for(x in tokens) ctx._source['fullName'] += ' ' + x + '|6'; }; if (ctx._source['commune']!=null) { def tokens = ctx._source['commune'].split(' '); for(x in tokens) ctx._source['fullName'] += ' ' + x + '|5'; }; if (ctx._source['code_arrondissement']!=null) { def tokens = ctx._source['code_arrondissement'].split(' '); for(x in tokens) ctx._source['fullName'] += ' ' + x + '|4'; }; if (ctx._source['code_postal']!=null) { def tokens = ctx._source['code_postal'].split(' '); for(x in tokens) ctx._source['fullName'] += ' ' + x + '|3'; }; if (ctx._source['numero']!=null) { ctx._source['fullName'] += ' ' + ctx._source['numero'] + '|11'; }; if (ctx._source['repetition']!=null) { def tokens = ctx._source['repetition'].split(' '); for(x in tokens) ctx._source['fullName'] += ' ' + x + '|11'; }; if (ctx._source['type_de_voie']!=null) { def tokens = ctx._source['type_de_voie'].split(' '); for(x in tokens) ctx._source['fullName'] += ' ' + x + '|2'; }; if (ctx._source['article']!=null) { def tokens = ctx._source['article'].split(' '); for(x in tokens) ctx._source['fullName'] += ' ' + x + '|2'; }; if (ctx._source['libelle']!=null) { def tokens = ctx._source['libelle'].split(' '); for(x in tokens) ctx._source['fullName'] += ' ' + x + '|2'; }; if (ctx._source['ligne1']!=null) { def tokens = ctx._source['ligne1'].split(' '); for(x in tokens) ctx._source['fullName'] += ' ' + x + '|1'; };" } } }'
Le mapping adresse
Après les type poizon, le type adresse est le plus complet. Sa géométrie est un point, mais pour des raisons pratiques, le type geo_shape est employé. Son mapping est défini de la manière suivante :
$ curl -XPUT 'http://localhost:9200/jdonref/adresse/_mapping' -d '{ "adresse": { "_type": {"store": true}, "_source": {"excludes": ["geometrie"]}, "properties" : { "adr_id" : { "type" : "string", "index":"not_analyzed"}, "tro_id" : { "type" : "string", "index":"not_analyzed"}, "voi_id" : { "type" : "string", "index":"not_analyzed"}, "code_insee" : { "type" : "string", "index":"not_analyzed", "copy_to": ["codes"]}, "code_insee_commune" : { "type" : "string", "index":"not_analyzed", "copy_to": ["codes"]}, "code_departement" : { "type" : "string", "index":"not_analyzed", "copy_to": ["codes"]}, "code_pays" : { "type" : "string" , "term_vector" : "with_positions_offsets", "index_analyzer":"jdonrefv4_codes_index","search_analyzer":"jdonrefv4_search", "similarity":"jdonrefv4"}, "codes" : { "type" : "string", "term_vector" : "with_positions_offsets", "index_analyzer":"jdonrefv4_codes_index","search_analyzer":"jdonrefv4_search", "similarity":"jdonrefv4"}, "numero" : { "type" : "integer", "index":"not_analyzed"}, "repetition" : { "type" : "string", "index":"not_analyzed"}, "type_de_voie" : { "type" : "string", "index":"not_analyzed"}, "article" : { "type" : "string", "index":"not_analyzed"}, "libelle" : { "type" : "string", "index":"not_analyzed"}, "commune" : { "type" : "string" , "term_vector" : "with_positions_offsets", "index_analyzer":"jdonrefv4_index","search_analyzer":"jdonrefv4_search", "similarity":"jdonrefv4"}, "code_arrondissement" : { "type" : "string", "index":"not_analyzed", "copy_to": ["codes"]}, "code_postal" : { "type" : "string", "index":"not_analyzed", "copy_to": ["codes"]}, "pays" : { "type" : "string" , "index": "no"}, "t0" : { "type" : "date", "format": "YYYY-MM-dd HH:mm:ss", "index":"not_analyzed"}, "t1" : { "type" : "date", "format": "YYYY-MM-dd HH:mm:ss", "index":"not_analyzed"}, "ligne2" : { "type" : "string", "index":"no"}, "ligne3" : { "type" : "string", "index":"no"}, "ligne4" : { "type" : "string", "term_vector" : "with_positions_offsets", "index_analyzer":"jdonrefv4_index","search_analyzer":"jdonrefv4_search", "similarity":"jdonrefv4"}, "ligne5" : { "type" : "string", "index":"no"}, "ligne6" : { "type" : "string", "index": "no"}, "ligne7" : { "type" : "string", "term_vector" : "with_positions_offsets", "index_analyzer":"jdonrefv4_index","search_analyzer":"jdonrefv4_search", "similarity":"jdonrefv4"}, "pin" : { "properties" : { "centroide" : { "type" : "geo_point" , "fielddata" : { "format" : "compressed" , "precision" : "1cm"}}}}, "geometrie" : { "type" : "geo_shape", "precision": "1cm", "tree": "quadtree"}, "fullName" : {"type": "string", "term_vector" : "with_positions_offsets_payloads", "index_analyzer":"jdonrefv4_index_token_count","search_analyzer":"jdonrefv4_search", "similarity":"jdonrefv4"} }, "transform" : { "lang" : "groovy", "script" : "ctx._source['fullName'] = ; if (ctx._source['ligne7']!=null) { def tokens = ctx._source['ligne7'].split(' '); for(x in tokens) ctx._source['fullName'] += ' ' + x + '|9'; }; if (ctx._source['code_pays']!=null) { def tokens = ctx._source['code_pays'].split(' '); for(x in tokens) ctx._source['fullName'] += ' ' + x + '|10'; }; if (ctx._source['code_departement']!=null) { def tokens = ctx._source['code_departement'].split(' '); for(x in tokens) ctx._source['fullName'] += ' ' + x + '|8'; }; if ( ctx._source['code_insee']!=null) { def tokens = ctx._source['code_insee'].split(' '); for(x in tokens) ctx._source['fullName'] += ' ' + x + '|7'; }; if (ctx._source['code_insee_commune']!=null) { def tokens = ctx._source['code_insee_commune'].split(' '); for(x in tokens) ctx._source['fullName'] += ' ' + x + '|6'; }; if (ctx._source['commune']!=null) { def tokens = ctx._source['commune'].split(' '); for(x in tokens) ctx._source['fullName'] += ' ' + x + '|5'; }; if (ctx._source['code_arrondissement']!=null) { def tokens = ctx._source['code_arrondissement'].split(' '); for(x in tokens) ctx._source['fullName'] += ' ' + x + '|4'; }; if (ctx._source['code_postal']!=null) { def tokens = ctx._source['code_postal'].split(' '); for(x in tokens) ctx._source['fullName'] += ' ' + x + '|3'; }; if (ctx._source['numero']!=null) { ctx._source['fullName'] += ' ' + ctx._source['numero'] + '|11'; }; if (ctx._source['repetition']!=null) { def tokens = ctx._source['repetition'].split(' '); for(x in tokens) ctx._source['fullName'] += ' ' + x + '|11'; }; if (ctx._source['type_de_voie']!=null) { def tokens = ctx._source['type_de_voie'].split(' '); for(x in tokens) ctx._source['fullName'] += ' ' + x + '|2'; }; if (ctx._source['article']!=null) { def tokens = ctx._source['article'].split(' '); for(x in tokens) ctx._source['fullName'] += ' ' + x + '|2'; }; if (ctx._source['libelle']!=null) { def tokens = ctx._source['libelle'].split(' '); for(x in tokens) ctx._source['fullName'] += ' ' + x + '|2'; };" } } }'
Le mapping troncon
Le mapping troncon correspond à une portion de voie. Sa géométrie est une linestring. Il dispose de bornes de début et de fin. Mais contrairement à la base de donnée PostgreSQL de JDONREF, il n'a pas de bornes pour chaque coté du troncon (2 troncons sont créés). Il n'est pas utilisé par la requête mais pourrait l'être ultérieurement pour fournir une interpolation métrique du géocodage. Son mapping est défini de la manière suivante :
$ curl -XPUT 'http://localhost:9200/jdonref/troncon/_mapping' -d '{ "troncon": { "_type": {"store": true}, "_source": {"excludes": ["geometrie"]}, "properties" : { "tro_id" : { "type" : "string", "index":"not_analyzed"}, "voi_id" : { "type" : "string", "index":"not_analyzed"}, "code_insee" : { "type" : "string", "index":"not_analyzed", "copy_to": ["codes"]}, "code_insee_commune" : { "type" : "string", "index":"not_analyzed", "copy_to": ["codes"]}, "code_departement" : { "type" : "string", "index":"not_analyzed", "copy_to": ["codes"]}, "code_pays" : { "type" : "string" , "term_vector" : "with_positions_offsets", "index_analyzer":"jdonrefv4_codes_index","search_analyzer":"jdonrefv4_search", "similarity":"jdonrefv4"}, "codes" : { "type" : "string", "term_vector" : "with_positions_offsets", "index_analyzer":"jdonrefv4_codes_index","search_analyzer":"jdonrefv4_search", "similarity":"jdonrefv4"}, "numero_debut" : { "type" : "integer", "index":"not_analyzed"}, "numero_fin" : { "type" : "integer", "index":"not_analyzed"}, "repetition_debut" : { "type" : "string", "index":"not_analyzed"}, "repetition_fin" : { "type" : "string", "index":"not_analyzed"}, "type_de_voie" : { "type" : "string", "index":"not_analyzed"}, "article" : { "type" : "string", "index":"not_analyzed"}, "libelle" : { "type" : "string", "index":"not_analyzed"}, "commune" : { "type" : "string" , "term_vector" : "with_positions_offsets", "index_analyzer":"jdonrefv4_index","search_analyzer":"jdonrefv4_search", "similarity":"jdonrefv4"}, "code_arrondissement" : { "type" : "string", "index":"not_analyzed", "copy_to": ["codes"]}, "code_postal" : { "type" : "string", "index":"not_analyzed", "copy_to": ["codes"]}, "pays" : { "type" : "string" , "index": "no"}, "t0" : { "type" : "date", "format": "YYYY-MM-dd HH:mm:ss", "index":"not_analyzed"}, "t1" : { "type" : "date", "format": "YYYY-MM-dd HH:mm:ss", "index":"not_analyzed"}, "ligne4" : { "type" : "string", "term_vector" : "with_positions_offsets", "index_analyzer":"jdonrefv4_index","search_analyzer":"jdonrefv4_search", "similarity":"jdonrefv4"}, "ligne5" : { "type" : "string", "index":"no"}, "ligne6" : { "type" : "string", "index": "no"}, "ligne7" : { "type" : "string", "term_vector" : "with_positions_offsets", "index_analyzer":"jdonrefv4_index","search_analyzer":"jdonrefv4_search", "similarity":"jdonrefv4"}, "pin" : { "properties" : { "centroide" : { "type" : "geo_point" , "fielddata" : { "format" : "compressed" , "precision" : "1cm"}}}}, "geometrie" : { "type" : "geo_shape", "precision": "1cm", "tree": "quadtree"}, "fullName" : {"type": "string", "term_vector" : "with_positions_offsets_payloads", "index_analyzer":"jdonrefv4_index_token_count","search_analyzer":"jdonrefv4_search", "similarity":"jdonrefv4"} }, "transform" : { "lang" : "groovy", "script" : "ctx._source['fullName'] = ; if (ctx._source['ligne7']!=null) { def tokens = ctx._source['ligne7'].split(' '); for(x in tokens) ctx._source['fullName'] += ' ' + x + '|9'; }; if (ctx._source['code_pays']!=null) { def tokens = ctx._source['code_pays'].split(' '); for(x in tokens) ctx._source['fullName'] += ' ' + x + '|10'; }; if (ctx._source['code_departement']!=null) { def tokens = ctx._source['code_departement'].split(' '); for(x in tokens) ctx._source['fullName'] += ' ' + x + '|8'; }; if ( ctx._source['code_insee']!=null) { def tokens = ctx._source['code_insee'].split(' '); for(x in tokens) ctx._source['fullName'] += ' ' + x + '|7'; }; if (ctx._source['code_insee_commune']!=null) { def tokens = ctx._source['code_insee_commune'].split(' '); for(x in tokens) ctx._source['fullName'] += ' ' + x + '|6'; }; if (ctx._source['commune']!=null) { def tokens = ctx._source['commune'].split(' '); for(x in tokens) ctx._source['fullName'] += ' ' + x + '|5'; }; if (ctx._source['code_arrondissement']!=null) { def tokens = ctx._source['code_arrondissement'].split(' '); for(x in tokens) ctx._source['fullName'] += ' ' + x + '|4'; }; if (ctx._source['code_postal']!=null) { def tokens = ctx._source['code_postal'].split(' '); for(x in tokens) ctx._source['fullName'] += ' ' + x + '|3'; }; if (ctx._source['ligne4']!=null) { def tokens = ctx._source['ligne4'].split(' '); for(x in tokens) ctx._source['fullName'] += ' ' + x + '|2'; };" } } }'
Le mapping voie
Le mapping voie correspond à une adresse sans numéro. Sa géométrie est une linestring (en attendant l'implémentation du multilinestring par elasticsearch). Elle dispose d'un numéro de début et de fin. Son mapping est défini de la manière suivante :
$ curl -XPUT 'http://localhost:9200/jdonref/voie/_mapping' -d '{ "voie": { "_type": {"store": true}, "_source": {"excludes": ["geometrie"]}, "properties" : { "voi_id" : { "type" : "string", "index":"not_analyzed"}, "code_insee" : { "type" : "string", "index":"not_analyzed", "copy_to": ["codes"]}, "code_insee_commune" : { "type" : "string", "index":"not_analyzed", "copy_to": ["codes"]}, "code_departement" : { "type" : "string", "index":"not_analyzed", "copy_to": ["codes"]}, "code_pays" : { "type" : "string" , "term_vector" : "with_positions_offsets", "index_analyzer":"jdonrefv4_codes_index","search_analyzer":"jdonrefv4_search", "similarity":"jdonrefv4"}, "codes" : { "type" : "string", "term_vector" : "with_positions_offsets", "index_analyzer":"jdonrefv4_codes_index","search_analyzer":"jdonrefv4_search", "similarity":"jdonrefv4"}, "numero_min" : { "type" : "integer", "index":"not_analyzed"}, "numero_max" : { "type" : "integer", "index":"not_analyzed"}, "type_de_voie" : { "type" : "string", "index":"not_analyzed"}, "article" : { "type" : "string", "index":"not_analyzed"}, "libelle" : { "type" : "string", "index":"not_analyzed"}, "commune" : { "type" : "string" , "term_vector" : "with_positions_offsets", "index_analyzer":"jdonrefv4_index","search_analyzer":"jdonrefv4_search", "similarity":"jdonrefv4"}, "code_arrondissement" : { "type" : "string", "index":"not_analyzed", "copy_to": ["codes","fullName"]}, "code_postal" : { "type" : "string", "index":"not_analyzed", "copy_to": ["codes","fullName"]}, "pays" : { "type" : "string" , "index": "no"}, "t0" : { "type" : "date", "format": "YYYY-MM-dd HH:mm:ss", "index":"not_analyzed"}, "t1" : { "type" : "date", "format": "YYYY-MM-dd HH:mm:ss", "index":"not_analyzed"}, "ligne4" : { "type" : "string", "term_vector" : "with_positions_offsets", "index_analyzer":"jdonrefv4_index","search_analyzer":"jdonrefv4_search", "similarity":"jdonrefv4"}, "ligne5" : { "type" : "string", "index":"no"}, "ligne6" : { "type" : "string", "index": "no"}, "ligne7" : { "type" : "string", "term_vector" : "with_positions_offsets", "index_analyzer":"jdonrefv4_index","search_analyzer":"jdonrefv4_search", "similarity":"jdonrefv4"}, "pin" : { "properties" : { "centroide" : { "type" : "geo_point" , "fielddata" : { "format" : "compressed" , "precision" : "1cm"}}}}, "geometrie" : { "type" : "geo_shape", "precision": "1cm", "tree": "quadtree"}, "fullName" : {"type": "string", "term_vector" : "with_positions_offsets_payloads", "index_analyzer":"jdonrefv4_index_token_count","search_analyzer":"jdonrefv4_search", "similarity":"jdonrefv4"} }, "transform" : { "lang" : "groovy", "script" : "ctx._source['fullName'] = ; if (ctx._source['ligne7']!=null) { def tokens = ctx._source['ligne7'].split(' '); for(x in tokens) ctx._source['fullName'] += ' ' + x + '|9'; }; if (ctx._source['code_pays']!=null) { def tokens = ctx._source['code_pays'].split(' '); for(x in tokens) ctx._source['fullName'] += ' ' + x + '|10'; }; if (ctx._source['code_departement']!=null) { def tokens = ctx._source['code_departement'].split(' '); for(x in tokens) ctx._source['fullName'] += ' ' + x + '|8'; }; if ( ctx._source['code_insee']!=null) { def tokens = ctx._source['code_insee'].split(' '); for(x in tokens) ctx._source['fullName'] += ' ' + x + '|7'; }; if (ctx._source['code_insee_commune']!=null) { def tokens = ctx._source['code_insee_commune'].split(' '); for(x in tokens) ctx._source['fullName'] += ' ' + x + '|6'; }; if (ctx._source['commune']!=null) { def tokens = ctx._source['commune'].split(' '); for(x in tokens) ctx._source['fullName'] += ' ' + x + '|5'; }; if (ctx._source['code_arrondissement']!=null) { def tokens = ctx._source['code_arrondissement'].split(' '); for(x in tokens) ctx._source['fullName'] += ' ' + x + '|4'; }; if (ctx._source['code_postal']!=null) { def tokens = ctx._source['code_postal'].split(' '); for(x in tokens) ctx._source['fullName'] += ' ' + x + '|3'; }; if (ctx._source['ligne4']!=null) { def tokens = ctx._source['ligne4'].split(' '); for(x in tokens) ctx._source['fullName'] += ' ' + x + '|2'; };" } } }'
Le mapping commune
Le mapping commune a pour géométrie un multipolygon, sans extrusion. Son mapping est défini de la manière suivante :
$ curl -XPUT 'http://localhost:9200/jdonref/commune/_mapping' -d '{ "commune": { "_type": {"store": true}, "_source": {"excludes": ["geometrie"]}, "properties" : { "code_insee" : { "type" : "string", "index":"not_analyzed", "copy_to": ["codes"]}, "code_departement" : { "type" : "string", "index":"not_analyzed", "copy_to": ["codes"]}, "code_insee_commune" : { "type" : "string", "index":"not_analyzed", "copy_to": ["codes"]}, "code_pays" : { "type" : "string" , "term_vector" : "with_positions_offsets", "index_analyzer":"jdonrefv4_codes_index","search_analyzer":"jdonrefv4_search", "similarity":"jdonrefv4"}, "commune" : { "type" : "string" , "term_vector" : "with_positions_offsets", "index_analyzer":"jdonrefv4_index","search_analyzer":"jdonrefv4_search", "similarity":"jdonrefv4"}, "code_arrondissement" : { "type" : "string", "index":"not_analyzed", "copy_to": ["codes"]}, "code_postal" : { "type" : "string", "index":"not_analyzed", "copy_to": ["codes"]}, "codes" : { "type" : "string", "term_vector" : "with_positions_offsets", "index_analyzer":"jdonrefv4_codes_index","search_analyzer":"jdonrefv4_search", "similarity":"jdonrefv4"}, "pays" : { "type" : "string" , "index": "no"}, "t0" : { "type" : "date", "format": "YYYY-MM-dd HH:mm:ss", "index":"not_analyzed"}, "t1" : { "type" : "date", "format": "YYYY-MM-dd HH:mm:ss", "index":"not_analyzed"}, "ligne5" : { "type" : "string", "index":"no"}, "ligne6" : { "type" : "string", "index": "no"}, "ligne7" : { "type" : "string", "term_vector" : "with_positions_offsets", "index_analyzer":"jdonrefv4_index","search_analyzer":"jdonrefv4_search", "similarity":"jdonrefv4"}, "pin" : { "properties" : { "centroide" : { "type" : "geo_point" , "fielddata" : { "format" : "compressed" , "precision" : "1cm"}}}}, "geometrie" : { "type" : "geo_shape", "precision": "1cm", "tree": "quadtree"}, "fullName" : {"type": "string", "term_vector" : "with_positions_offsets_payloads", "index_analyzer":"jdonrefv4_index_token_count","search_analyzer":"jdonrefv4_search", "similarity":"jdonrefv4"} }, "transform" : { "lang" : "groovy", "script" : "ctx._source['fullName'] = ; if (ctx._source['ligne7']!=null) { def tokens = ctx._source['ligne7'].split(' '); for(x in tokens) ctx._source['fullName'] += ' ' + x + '|9'; }; if (ctx._source['code_pays']!=null) { def tokens = ctx._source['code_pays'].split(' '); for(x in tokens) ctx._source['fullName'] += ' ' + x + '|10'; }; if (ctx._source['code_departement']!=null) { def tokens = ctx._source['code_departement'].split(' '); for(x in tokens) ctx._source['fullName'] += ' ' + x + '|8'; }; if ( ctx._source['code_insee']!=null) { def tokens = ctx._source['code_insee'].split(' '); for(x in tokens) ctx._source['fullName'] += ' ' + x + '|7'; }; if (ctx._source['code_insee_commune']!=null) { def tokens = ctx._source['code_insee_commune'].split(' '); for(x in tokens) ctx._source['fullName'] += ' ' + x + '|6'; }; if (ctx._source['commune']!=null) { def tokens = ctx._source['commune'].split(' '); for(x in tokens) ctx._source['fullName'] += ' ' + x + '|5'; }; if (ctx._source['code_arrondissement']!=null) { def tokens = ctx._source['code_arrondissement'].split(' '); for(x in tokens) ctx._source['fullName'] += ' ' + x + '|4'; }; if (ctx._source['code_postal']!=null) { def tokens = ctx._source['code_postal'].split(' '); for(x in tokens) ctx._source['fullName'] += ' ' + x + '|3'; };" } } }'
Le mapping departement
Le mapping commune a pour géométrie un multipolygon, sans extrusion. Son mapping est défini de la manière suivante :
$ curl -XPUT 'http://localhost:9200/jdonref/departement/_mapping' -d '{ "departement": { "_type": {"store": true}, "_source": {"excludes": ["geometrie"]}, "properties" : { "code_departement" : { "type" : "string", "term_vector" : "with_positions_offsets", "index":"not_analyzed", "copy_to": ["codes"]}, "code_pays" : { "type" : "string" , "term_vector" : "with_positions_offsets", "index_analyzer":"jdonrefv4_codes_index","search_analyzer":"jdonrefv4_search", "similarity":"jdonrefv4"}, "codes" : { "type" : "string", "term_vector" : "with_positions_offsets", "index_analyzer":"jdonrefv4_codes_index","search_analyzer":"jdonrefv4_search", "similarity":"jdonrefv4"}, "pays" : { "type" : "string" , "index": "no"}, "t0" : { "type" : "date", "format": "YYYY-MM-dd HH:mm:ss", "index":"not_analyzed"}, "t1" : { "type" : "date", "format": "YYYY-MM-dd HH:mm:ss", "index":"not_analyzed"}, "ligne6" : { "type" : "string", "index": "no"}, "ligne7" : { "type" : "string", "term_vector" : "with_positions_offsets", "index_analyzer":"jdonrefv4_index","search_analyzer":"jdonrefv4_search", "similarity":"jdonrefv4"}, "pin" : { "properties" : { "centroide" : { "type" : "geo_point" , "fielddata" : { "format" : "compressed" , "precision" : "1cm"}}}}, "geometrie" : { "type" : "geo_shape", "precision": "1cm", "tree": "quadtree"}, "fullName" : {"type": "string", "term_vector" : "with_positions_offsets_payloads", "index_analyzer":"jdonrefv4_index_token_count","search_analyzer":"jdonrefv4_search", "similarity":"jdonrefv4"} }, "transform" : { "lang" : "groovy", "script" : "ctx._source['fullName'] = ; if (ctx._source['ligne7']!=null) { def tokens = ctx._source['ligne7'].split(' '); for(x in tokens) ctx._source['fullName'] += ' ' + x + '|9'; }; if (ctx._source['code_pays']!=null) { def tokens = ctx._source['code_pays'].split(' '); for(x in tokens) ctx._source['fullName'] += ' ' + x + '|10'; }; if (ctx._source['code_departement']!=null) { def tokens = ctx._source['code_departement'].split(' '); for(x in tokens) ctx._source['fullName'] += ' ' + x + '|8'; };" } } }'
Le mapping pays
Le mapping pays a pour géométrie un multipolygon, sans extrusion. Son mapping est défini de la manière suivante :
$ curl -XPUT 'http://localhost:9200/jdonref/pays/_mapping' -d '{ "pays": { "_type": {"store": true}, "_source": {"excludes": ["geometrie"]}, "properties" : { "code_pays" : { "type" : "string" , "term_vector" : "with_positions_offsets", "index_analyzer":"jdonrefv4_codes_index","search_analyzer":"jdonrefv4_search", "similarity":"jdonrefv4"}, "pays" : { "type" : "string" , "index": "no"}, "t0" : { "type" : "date", "format": "YYYY-MM-dd HH:mm:ss", "index":"not_analyzed"}, "t1" : { "type" : "date", "format": "YYYY-MM-dd HH:mm:ss", "index":"not_analyzed"}, "ligne7" : { "type" : "string", "term_vector" : "with_positions_offsets", "index_analyzer":"jdonrefv4_index","search_analyzer":"jdonrefv4_search", "similarity":"jdonrefv4"}, "pin" : { "properties" : { "centroide" : { "type" : "geo_point" , "fielddata" : { "format" : "compressed" , "precision" : "1cm"}}}}, "geometrie" : { "type" : "geo_shape", "precision": "1cm", "tree": "quadtree"}, "fullName" : {"type": "string", "term_vector" : "with_positions_offsets_payloads", "index_analyzer":"jdonrefv4_index_token_count","search_analyzer":"jdonrefv4_search", "similarity":"jdonrefv4"} }, "transform" : { "lang" : "groovy", "script" : "ctx._source['fullName'] = ; if (ctx._source['ligne7']!=null) { def tokens = ctx._source['ligne7'].split(' '); for(x in tokens) ctx._source['fullName'] += ' ' + x + '|9'; }; if (ctx._source['code_pays']!=null) { def tokens = ctx._source['code_pays'].split(' '); for(x in tokens) ctx._source['fullName'] += ' ' + x + '|10'; };" } } }'
définir son propre mapping
JDONREFv4 n'attend qu'un unique champ de recherche (qui est personnalisable). Prenons l'exemple du champ de recherche fullName. Le minimum pour faire fonctionner la requête jdonrefv4 est :
- un unique champ de recherche. Il s'agit de fullName par défaut, mais il est personnalisable.
- le respect des types poizon, adresse, voie, commune, departement, pays (et troncon). Pour le moment, ils ne peuvent pas être personnalisés
- l'utilisation des payloads appropriés. Il doit s'agir d'entier. Le séparateur reste personnalisable dans les settings de votre index.
Pour le moment, les payloads ne sont pas personnalisables. Les payloads suivant doivent donc être utilisés :
- 10 = code_pays
- 9 = ligne7
- 8 = code_departement
- 7 = code_insee
- 6 = code_insee_commune
- 5 = commune
- 4 = code_arrondissement
- 3 = code_postal
- 11 = numero, repetition
- 2 = type_de_voie, article, libelle
- 1 = ligne1
Pour le moment, la requête jdonrefv4 n'est pas personnalisable. Il ne vous est donc pas possible (sans développement) d'ajouter de nouveau payloads.