JDONREFv4 Mappings

De JDONREF Wiki
Révision de 26 février 2016 à 22:14 par Julien2512 (discussion | contributions) (Le mapping departement)

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.

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
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" ,  "index_analyzer":"jdonrefv4_codes_index","search_analyzer":"jdonrefv4_search"},
                         "codes" : { "type" : "string",  "index_analyzer":"jdonrefv4_codes_index","search_analyzer":"jdonrefv4_search"},
                         "numero" : { "type" : "string", "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" ,  "index_analyzer":"jdonrefv4_index","search_analyzer":"jdonrefv4_search"},
                         "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",  "index_analyzer":"jdonrefv4_index","search_analyzer":"jdonrefv4_search"},
                         "ligne2" : { "type" : "string", "index":"no"},
                         "ligne3" : { "type" : "string", "index":"no"},
                         "ligne4" : { "type" : "string",  "index_analyzer":"jdonrefv4_index","search_analyzer":"jdonrefv4_search"},
                         "ligne5" : { "type" : "string", "index":"no"},
                         "ligne6" : { "type" : "string", "index": "no"},
                         "ligne7" : { "type" : "string",  "index_analyzer":"jdonrefv4_index","search_analyzer":"jdonrefv4_search"},
                         "pin" : { "properties" : { "centroide" : { "type" : "geo_point" , "fielddata" : { "format" : "compressed" , "precision" : "1cm"}}}},
                         "geometrie" : { "type" : "geo_shape", "precision": "1cm", "tree": "quadtree"},
                         "score" : { "type" : "string", "term_vector":"yes", "index":"analyzed" , "analyzer":"jdonrefv4_score_analyzer"}
     },
       "transform": {
         "lang" : "groovy",
         "script" : "ctx._source['score']= ; if (ctx._source['ligne1']!=null) { def tokens= ctx._source['ligne1'].split(' '); for(x in tokens) ctx._source['score'] += ' ' + x + '|11'; }; if (ctx._source['ligne4']!=null) { def tokens= ctx._source['ligne4'].split(' '); for(x in tokens) ctx._source['score'] += ' ' + x + '|12'; }; if (ctx._source['ligne6']!=null) { def tokens= ctx._source['ligne6'].split(' '); for(x in tokens) ctx._source['score'] += ' ' + x + '|13'; }; if (ctx._source['ligne7']!=null) { def tokens= ctx._source['ligne7'].split(' '); for(x in tokens) ctx._source['score'] += ' ' + x + '|14'; };"
       }
   }
 }'
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":"no"},
           "voi_id" : { "type" : "string", "index":"no"},
           "article" : { "type" : "string", "index":"no"},
           "libelle" : { "type" : "string", "analyzer":"jdonrefv4_index_token_count","search_analyzer":"jdonrefv4_search"},
           "type_de_voie" : { "type" : "string", "analyzer":"jdonrefv4_index_token_count","search_analyzer":"jdonrefv4_search"},
           "code_pays" : { "type" : "string", "index":"no"},
           "pays" : { "type" : "string" , "index": "no"},
           "code_insee" : { "type" : "string", "index":"not_analyzed", "copy_to": ["codes"]},
           "code_insee_commune" : { "type" : "string", "index":"not_analyzed", "copy_to": ["codes"]},
           "code_arrondissement" : { "type" : "string", "index":"not_analyzed", "copy_to": ["codes"]},
           "code_postal" : { "type" : "string", "index":"not_analyzed", "copy_to": ["codes"]},
           "code_departement" : { "type" : "string", "index":"not_analyzed", "copy_to": ["codes"]},
           "codes" : { "type" : "string",  "analyzer":"jdonrefv4_codes_index","search_analyzer":"jdonrefv4_search"},
           "commune" : { "type" : "string" , "analyzer":"jdonrefv4_index","search_analyzer":"jdonrefv4_search"},
           "numero" : { "type" : "string", "analyzer":"jdonrefv4_index_token_count","search_analyzer":"jdonrefv4_search"},
           "repetition" : { "type" : "string", "analyzer":"jdonrefv4_index_token_count","search_analyzer":"jdonrefv4_search"},
           "pin" : { "properties" : { "centroide" : { "type" : "geo_point" , "fielddata" : { "format" : "compressed" , "precision" : "1cm"}}}},
           "geometrie" : { "type" : "geo_shape", "precision": "1cm", "tree": "quadtree"},
           "score" : { "type" : "string", "term_vector": "yes","index":"analyzed" , "analyzer":"jdonrefv4_score_analyzer"}
       },
       "transform": {
         "lang" : "groovy",
         "script" : "ctx._source['score']= ; if (ctx._source['numero']!=null) { def tokens= ctx._source['numero'].split(' '); for(x in tokens) ctx._source['numero'] += ' ' + x + '|1'; }; if (ctx._source['repetition']!=null) { def tokens= ctx._source['repetition'].split(' '); for(x in tokens) ctx._source['score'] += ' ' + x + '|2'; }; if (ctx._source['type_de_voie']!=null) { def tokens= ctx._source['type_de_voie'].split(' '); for(x in tokens) ctx._source['score'] += ' ' + x + '|3'; }; if (ctx._source['libelle']!=null) { def tokens= ctx._source['libelle'].split(' '); for(x in tokens) ctx._source['score'] += ' ' + x + '|4'; }; if (ctx._source['code_postal']!=null) { def tokens= ctx._source['code_postal'].split(' '); for(x in tokens) ctx._source['score'] += ' ' + x + '|5'; }; if (ctx._source['code_departement']!=null) { def tokens= ctx._source['code_departement'].split(' '); for(x in tokens) ctx._source['score'] += ' ' + x + '|6'; }; if (ctx._source['code_arrondissement']!=null) { def tokens= ctx._source['code_arrondissement'].split(' '); for(x in tokens) ctx._source['score'] += ' ' + x + '|7'; }; if (ctx._source['code_insee']!=null) { def tokens= ctx._source['code_insee'].split(' '); for(x in tokens) ctx._source['score'] += ' ' + x + '|8'; }; if (ctx._source['code_insee_commune']!=null) { def tokens= ctx._source['code_insee_commune'].split(' '); for(x in tokens) ctx._source['score'] += ' ' + x + '|9'; }; if (ctx._source['commune']!=null) { def tokens= ctx._source['commune'].split(' '); for(x in tokens) ctx._source['score'] += ' ' + x + '|10'; }; "
       }
   }
 }'
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 + '|3'; }; if ( ctx._source['code_insee']!=null) { def tokens = ctx._source['code_insee'].split(' '); for(x in tokens) ctx._source['fullName'] += ' ' + x + '|3'; }; if (ctx._source['code_insee_commune']!=null) { def tokens = ctx._source['code_insee_commune'].split(' '); for(x in tokens) ctx._source['fullName'] += ' ' + x + '|3'; }; 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 + '|3'; }; 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" ,  "index_analyzer":"jdonrefv4_codes_index","search_analyzer":"jdonrefv4_search", "similarity":"jdonrefv4"},
                           "codes" : { "type" : "string",  "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_analyzer":"jdonrefv4_index","search_analyzer":"jdonrefv4_search", "similarity":"jdonrefv4"},
                           "article" : { "type" : "string", "index":"not_analyzed"},
                           "libelle" : { "type" : "string",  "index_analyzer":"jdonrefv4_index","search_analyzer":"jdonrefv4_search", "similarity":"jdonrefv4"},
                           "commune" : { "type" : "string" ,  "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", "index":"no"},
                           "ligne5" : { "type" : "string",  "index":"no"},
                           "ligne6" : { "type" : "string", "index": "no"},
                           "ligne7" : { "type" : "string",  "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"},
                           "score" : { "type" : "string", "term_vector":"yes", "index":"analyzed" , "analyzer":"jdonrefv4_score_analyzer"}
                       },
       "transform": {
         "lang" : "groovy",
         "script" : "ctx._source['score']= ; if (ctx._source['numero']!=null) { def tokens= ctx._source['numero'].split(' '); for(x in tokens) ctx._source['numero'] += ' ' + x + '|1'; }; if (ctx._source['repetition']!=null) { def tokens= ctx._source['repetition'].split(' '); for(x in tokens) ctx._source['score'] += ' ' + x + '|2'; }; if (ctx._source['type_de_voie']!=null) { def tokens= ctx._source['type_de_voie'].split(' '); for(x in tokens) ctx._source['score'] += ' ' + x + '|3'; }; if (ctx._source['libelle']!=null) { def tokens= ctx._source['libelle'].split(' '); for(x in tokens) ctx._source['score'] += ' ' + x + '|4'; }; if (ctx._source['code_postal']!=null) { def tokens= ctx._source['code_postal'].split(' '); for(x in tokens) ctx._source['score'] += ' ' + x + '|5'; }; if (ctx._source['code_departement']!=null) { def tokens= ctx._source['code_departement'].split(' '); for(x in tokens) ctx._source['score'] += ' ' + x + '|6'; }; if (ctx._source['code_arrondissement']!=null) { def tokens= ctx._source['code_arrondissement'].split(' '); for(x in tokens) ctx._source['score'] += ' ' + x + '|7'; }; if (ctx._source['code_insee']!=null) { def tokens= ctx._source['code_insee'].split(' '); for(x in tokens) ctx._source['score'] += ' ' + x + '|8'; }; if (ctx._source['code_insee_commune']!=null) { def tokens= ctx._source['code_insee_commune'].split(' '); for(x in tokens) ctx._source['score'] += ' ' + x + '|9'; }; if (ctx._source['commune']!=null) { def tokens= ctx._source['commune'].split(' '); for(x in tokens) ctx._source['score'] += ' ' + x + '|10'; }; "
       }
  }
}'
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" ,  "index_analyzer":"jdonrefv4_codes_index","search_analyzer":"jdonrefv4_search"},
                         "commune" : { "type" : "string" ,  "index_analyzer":"jdonrefv4_index","search_analyzer":"jdonrefv4_search"},
                         "code_arrondissement" : { "type" : "string", "index":"not_analyzed", "copy_to": ["codes"]},
                         "code_postal" : { "type" : "string", "index":"not_analyzed", "copy_to": ["codes"]},
                         "codes" : { "type" : "string",  "index_analyzer":"jdonrefv4_codes_index","search_analyzer":"jdonrefv4_search"},
                         "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",  "index_analyzer":"jdonrefv4_index","search_analyzer":"jdonrefv4_search"},
                         "pin" : { "properties" : { "centroide" : { "type" : "geo_point" , "fielddata" : { "format" : "compressed" , "precision" : "1cm"}}}},
                         "geometrie" : { "type" : "geo_shape", "precision": "1cm", "tree": "quadtree"},
                         "score" : { "type" : "string", "term_vector":"yes", "index":"analyzed" , "analyzer":"jdonrefv4_score_analyzer"}
                       },
       "transform": {
         "lang" : "groovy",
         "script" : "ctx._source['score']= ; if (ctx._source['numero']!=null) { def tokens= ctx._source['numero'].split(' '); for(x in tokens) ctx._source['numero'] += ' ' + x + '|1'; }; if (ctx._source['repetition']!=null) { def tokens= ctx._source['repetition'].split(' '); for(x in tokens) ctx._source['score'] += ' ' + x + '|2'; }; if (ctx._source['type_de_voie']!=null) { def tokens= ctx._source['type_de_voie'].split(' '); for(x in tokens) ctx._source['score'] += ' ' + x + '|3'; }; if (ctx._source['libelle']!=null) { def tokens= ctx._source['libelle'].split(' '); for(x in tokens) ctx._source['score'] += ' ' + x + '|4'; }; if (ctx._source['code_postal']!=null) { def tokens= ctx._source['code_postal'].split(' '); for(x in tokens) ctx._source['score'] += ' ' + x + '|5'; }; if (ctx._source['code_departement']!=null) { def tokens= ctx._source['code_departement'].split(' '); for(x in tokens) ctx._source['score'] += ' ' + x + '|6'; }; if (ctx._source['code_arrondissement']!=null) { def tokens= ctx._source['code_arrondissement'].split(' '); for(x in tokens) ctx._source['score'] += ' ' + x + '|7'; }; if (ctx._source['code_insee']!=null) { def tokens= ctx._source['code_insee'].split(' '); for(x in tokens) ctx._source['score'] += ' ' + x + '|8'; }; if (ctx._source['code_insee_commune']!=null) { def tokens= ctx._source['code_insee_commune'].split(' '); for(x in tokens) ctx._source['score'] += ' ' + x + '|9'; }; if (ctx._source['commune']!=null) { def tokens= ctx._source['commune'].split(' '); for(x in tokens) ctx._source['score'] += ' ' + x + '|10'; }; "
       }
   }
 }'
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",  "index":"not_analyzed", "copy_to": ["codes"]},
                           "code_pays" : { "type" : "string" ,  "index_analyzer":"jdonrefv4_codes_index","search_analyzer":"jdonrefv4_search"},
                           "codes" : { "type" : "string",  "index_analyzer":"jdonrefv4_codes_index","search_analyzer":"jdonrefv4_search"},
                           "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",  "index_analyzer":"jdonrefv4_index","search_analyzer":"jdonrefv4_search"},
                           "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"},
                           "score" : { "type" : "string", "term_vector":"yes", "index":"analyzed" , "analyzer":"jdonrefv4_score_analyzer"}
                       },
       "transform": {
         "lang" : "groovy",
         "script" : "ctx._source['score']= ; if (ctx._source['numero']!=null) { def tokens= ctx._source['numero'].split(' '); for(x in tokens) ctx._source['numero'] += ' ' + x + '|1'; }; if (ctx._source['repetition']!=null) { def tokens= ctx._source['repetition'].split(' '); for(x in tokens) ctx._source['score'] += ' ' + x + '|2'; }; if (ctx._source['type_de_voie']!=null) { def tokens= ctx._source['type_de_voie'].split(' '); for(x in tokens) ctx._source['score'] += ' ' + x + '|3'; }; if (ctx._source['libelle']!=null) { def tokens= ctx._source['libelle'].split(' '); for(x in tokens) ctx._source['score'] += ' ' + x + '|4'; }; if (ctx._source['code_postal']!=null) { def tokens= ctx._source['code_postal'].split(' '); for(x in tokens) ctx._source['score'] += ' ' + x + '|5'; }; if (ctx._source['code_departement']!=null) { def tokens= ctx._source['code_departement'].split(' '); for(x in tokens) ctx._source['score'] += ' ' + x + '|6'; }; if (ctx._source['code_arrondissement']!=null) { def tokens= ctx._source['code_arrondissement'].split(' '); for(x in tokens) ctx._source['score'] += ' ' + x + '|7'; }; if (ctx._source['code_insee']!=null) { def tokens= ctx._source['code_insee'].split(' '); for(x in tokens) ctx._source['score'] += ' ' + x + '|8'; }; if (ctx._source['code_insee_commune']!=null) { def tokens= ctx._source['code_insee_commune'].split(' '); for(x in tokens) ctx._source['score'] += ' ' + x + '|9'; }; if (ctx._source['commune']!=null) { def tokens= ctx._source['commune'].split(' '); for(x in tokens) ctx._source['score'] += ' ' + x + '|10'; }; "
       }
   }
 }'
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 :

  1. un unique champ de recherche. Il s'agit de fullName par défaut, mais il est personnalisable.
  2. le respect des types poizon, adresse, voie, commune, departement, pays (et troncon). Pour le moment, ils ne peuvent pas être personnalisés
  3. l'utilisation des payloads appropriés. Il doit s'agir d'entier. Le séparateur reste personnalisable dans les settings de votre index.

Outre le champ de recherche, la requête jdonrefv4 n'est pas personnalisable. Il ne vous est donc pas possible actuellement (sans développement) d'ajouter de nouveau payloads. 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