JDONREFv4 plugin GettingStarted : Différence entre versions

De JDONREF Wiki
m (Julien2512 a déplacé la page JDONREFv3ES plugin GettingStarted vers JDONREFv4 plugin GettingStarted : mise à niveau)
Ligne 1 : Ligne 1 :
L'utilisation du plugin JDONREFv3ES nécessite :
+
L'utilisation du plugin JDONREFv4 nécessite :
 
* de disposer d'un cluster [http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/setup.html elasticsearch] !
 
* de disposer d'un cluster [http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/setup.html elasticsearch] !
* de déployer le fichier de synonymes de JDONREFv3ES (voir [[JDONREFv3ES_Plugin#Pr.C3.A9requis_avant_d.27utiliser_le_plugin|ici]])
+
* de déployer le fichier de synonymes de JDONREFv4 (voir [[JDONREFv4_Plugin#Pr.C3.A9requis_avant_d.27utiliser_le_plugin|ici]])
* d'installer le [[JDONREFv3ES_Plugin|plugin]] JDONREFv3ES (voir [[JDONREFv3ES_Plugin#Installation_du_plugin| ici]])
+
* d'installer le [[JDONREFv4_Plugin|plugin]] JDONREFv4 (voir [[JDONREFv4_Plugin#Installation_du_plugin| ici]])
 
* puis d'indexer le contenu
 
* puis d'indexer le contenu
   
Vous êtes ensuite libre d'effectuer les recherches souhaitées ! L'API elasticsearch peut bien sûr être utilisée, mais le plugin jdonrefv3es fourni un moyen de chercher efficacement des adresses (c'est à dire avec les résultats auxquels on devrait s'attendre).
+
Vous êtes ensuite libre d'effectuer les recherches souhaitées ! L'API elasticsearch peut bien sûr être utilisée, mais le plugin jdonrefv4 fourni un moyen de chercher efficacement des adresses (c'est à dire avec les résultats auxquels on devrait s'attendre).
 
Cette page décrit une démarche possible en débutant par l'indexation du contenu.
 
Cette page décrit une démarche possible en débutant par l'indexation du contenu.
   
 
==== Création de l'index ====
 
==== Création de l'index ====
   
Commencez par vous créer un index en respectant la configuration fournie par le fichier jdonrefv3es-settings.json de la sorte :
+
Commencez par vous créer un index en respectant la configuration fournie par le fichier jdonrefv4-settings.json de la sorte :
   
 
curl -XPUT 'http://localhost:9200/jdonref/' -d '{
 
curl -XPUT 'http://localhost:9200/jdonref/' -d '{
Ligne 16 : Ligne 16 :
 
"analysis" : {
 
"analysis" : {
 
"analyzer": {
 
"analyzer": {
"jdonrefv3es_index" : {
+
"jdonrefv4_index" : {
 
"type" : "custom",
 
"type" : "custom",
"tokenizer" : "standard",
+
"tokenizer" : "whitespace",
"filter" : ["french_elision", "lowercase", "french_stop",/*/"french_keywords",*/ "french_stemmer","jdonrefv3es_synonyme", "jdonrefv3es_nGram"]
+
"filter" : ["delimited_payload_filter", "lowercase", "french_elision", "french_stop", /*/"french_keywords",*/ "french_stemmer","jdonrefv4_synonyme", "jdonrefv4_nGram"]
 
},
 
},
"jdonrefv3es_codes_index" : {
+
"jdonrefv4_codes_index" : {
 
"type" : "custom",
 
"type" : "custom",
 
"tokenizer" : "standard",
 
"tokenizer" : "standard",
 
"filter" : ["standard", "lowercase"]
 
"filter" : ["standard", "lowercase"]
 
},
 
},
"jdonrefv3es_search" : {
+
"jdonrefv4_search" : {
 
"type" : "custom",
 
"type" : "custom",
 
"tokenizer" : "standard",
 
"tokenizer" : "standard",
"filter" : ["french_elision", "lowercase", "french_stop",/*/"french_keywords",*/ "french_stemmer"]
+
"filter" : ["lowercase", "french_elision", "french_stop",/*/"french_keywords",*/ "french_stemmer"]
 
}
 
}
 
},
 
},
 
"filter" : {
 
"filter" : {
  +
"delimited_payload_filter" : {
  +
"type": "delimited_payload_filter",
  +
"delimiter" : "|",
  +
"encoding" : "int"
  +
},
 
"french_elision": {
 
"french_elision": {
"type": "elision",
+
"type": "elision",
"articles": [ "l", "m", "t", "qu", "n", "s",
+
"articles": [ "l", "m", "t", "qu", "n", "s",
"j", "d", "c", "jusqu", "quoiqu",
+
"j", "d", "c", "jusqu", "quoiqu",
"lorsqu", "puisqu"
+
"lorsqu", "puisqu"
]
+
]
 
},
 
},
 
"french_stop": {
 
"french_stop": {
"type": "stop",
+
"type": "stop",
"stopwords": "_french_"
+
"stopwords": "_french_"
 
},
 
},
 
// "french_keywords": {
 
// "french_keywords": {
// "type": "keyword_marker",
+
// "type": "keyword_marker",
// "keywords": []
+
// "keywords": []
 
// },
 
// },
 
"french_stemmer": {
 
"french_stemmer": {
"type": "stemmer",
+
"type": "stemmer",
"language": "light_french"
+
"language": "light_french"
 
},
 
},
 
// "jdonrefv3es_metaphone" : {
 
// "jdonrefv3es_metaphone" : {
Ligne 57 : Ligne 62 :
 
// "replace" : true
 
// "replace" : true
 
// },
 
// },
"jdonrefv3es_synonyme" : {
+
"jdonrefv4_synonyme" : {
 
"type" : "synonym",
 
"type" : "synonym",
"synonyms_path": "jdonrefv3es_synonym.fr_FR.txt"
+
"synonyms_path": "jdonrefv4_synonym.fr_FR.txt"
 
},
 
},
"jdonrefv3es_nGram" : {
+
"jdonrefv4_nGram" : {
"type" : "edgeNGram",
+
"type" : "jdonrefv4_edgengram",
"min_gram": 5,
+
"min_gram": 1,
 
"max_gram": 15,
 
"max_gram": 15,
"token_chars": ["digit"]
+
"token_chars": ["digit"],
  +
"withPayloads": true
 
}
 
}
 
},
 
},
 
"similarity": {
 
"similarity": {
"jdonrefv3es" : {
+
"jdonrefv4" : {
"type": "org.apache.lucene.search.similarities.JDONREFv3TermSimilarity"
+
"type": "org.apache.lucene.search.similarities.JDONREFv4TermSimilarity"
 
}
 
}
 
}
 
}
Ligne 81 : Ligne 86 :
   
 
==== Création des mappings ====
 
==== Création des mappings ====
Pour que le plugin jdonrefv3es soit efficace, il s'agit de respecter les [[JDONREFv3ES_Mappings|mappings]] fournis par jdonref.
+
Pour que le plugin jdonrefv4 soit efficace, il s'agit de respecter les [[JDONREFv4_Mappings|mappings]] fournis par jdonref.
 
Cette opération est obligatoire pour que la requête de JDONREF puisse traiter correctement les données indexées.
 
Cette opération est obligatoire pour que la requête de JDONREF puisse traiter correctement les données indexées.
   
Ligne 88 : Ligne 93 :
 
Vous avez peut-être aussi remarqué l'existence d'un champ calculé "codes". Si vous utilisez les mappings fournis, il se remplit automatiquement à partir du code_postal, code_insee, code_departement, code_arrondissement quelque soit l'objet considéré. Il est cependant vrai que dans le fond, vous pouvez vous en occuper vous-même.
 
Vous avez peut-être aussi remarqué l'existence d'un champ calculé "codes". Si vous utilisez les mappings fournis, il se remplit automatiquement à partir du code_postal, code_insee, code_departement, code_arrondissement quelque soit l'objet considéré. Il est cependant vrai que dans le fond, vous pouvez vous en occuper vous-même.
   
Le champ "fullName" est lui aussi précalculé et contient l'ensemble des termes utilisé par la requête JDONREFv3. Il n'est ainsi pas uniquement la concaténation des champs ligne1, ligne4, et ligne6, mais dispose aussi des champs indexés dans "codes". Il permet d'effectuer un premier niveau de filtrage sur les résultats, très rapidement.
+
Le champ "fullName" est lui aussi précalculé et contient l'ensemble des termes utilisé par la requête JDONREFv4. Il n'est ainsi pas uniquement la concaténation des champs ligne1, ligne4, et ligne6, mais dispose aussi des champs indexés dans "codes". Il permet d'effectuer un premier niveau de filtrage sur les résultats, très rapidement.
   
 
Enfin, le nom des types attribués à chaque mapping doit pour le moment être respecté. Dans le cas contraire, les malus ne pourront pas être appliqués.
 
Enfin, le nom des types attribués à chaque mapping doit pour le moment être respecté. Dans le cas contraire, les malus ne pourront pas être appliqués.
Ligne 94 : Ligne 99 :
 
===== Utiliser les synonymes =====
 
===== Utiliser les synonymes =====
   
Le fichier de synonymes a normalement été utilisé à la création de votre index à partir du fichier jdonrev3es_synonym.fr.txt.
+
Le fichier de synonymes a normalement été utilisé à la création de votre index à partir du fichier jdonrev4_synonym.fr.txt.
   
 
La recherche pourra ainsi par exemple être effectuée avec le type de voie "BD" plutôt que "BOULEVARD".
 
La recherche pourra ainsi par exemple être effectuée avec le type de voie "BD" plutôt que "BOULEVARD".
Ligne 105 : Ligne 110 :
 
et la création de l'analyzer serait par exemple:
 
et la création de l'analyzer serait par exemple:
 
"analyzer": {
 
"analyzer": {
"jdonrefv3es_index" : {
+
"jdonrefv4_index" : {
 
"type" : "custom",
 
"type" : "custom",
 
"tokenizer" : "standard",
 
"tokenizer" : "standard",
"filter" : ["standard", "lowercase", "jdonrefv3es_nGram"]
+
"filter" : ["standard", "lowercase", "jdonrefv4_nGram"]
 
},
 
},
"jdonrefv3es_search" : {
+
"jdonrefv4_search" : {
 
"type" : "custom",
 
"type" : "custom",
 
"tokenizer" : "standard",
 
"tokenizer" : "standard",
"filter" : ["standard", "lowercase", "jdonrefv3es_synonyme"]
+
"filter" : ["standard", "lowercase", "jdonrefv4_synonyme"]
 
}
 
}
 
},
 
},
Ligne 121 : Ligne 126 :
 
NB: l'analyzer n'est pas fourni dans les versions 0.1beta et 0.2
 
NB: l'analyzer n'est pas fourni dans les versions 0.1beta et 0.2
   
Si vous ne voulez pas remplir vous-même les champs "ligne4" et "ligne6", il vous sera possible d'utiliser l'[[JDONREFv3ES_Analyzer|analyzer]] fourni par jdonref :
+
Si vous ne voulez pas remplir vous-même les champs "ligne4" et "ligne6", il vous sera possible d'utiliser l'[[JDONREFv4_Analyzer|analyzer]] fourni par jdonref :
   
 
curl -XPUT 'http://localhost:9200/jdonref/' -d '{
 
curl -XPUT 'http://localhost:9200/jdonref/' -d '{
 
"analysis" : {
 
"analysis" : {
 
"analyzer" : {
 
"analyzer" : {
"jdonrefv3es": {
+
"jdonrefv4": {
 
"tokenizer": "whitespace"
 
"tokenizer": "whitespace"
 
}
 
}
Ligne 193 : Ligne 198 :
 
A noter qu'il est conseillé d'utiliser l'API [[http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/docs-bulk.html BULK]] d'ElasticSearch pour procéder à l'indexation d'un très grand nombre d'adresses.
 
A noter qu'il est conseillé d'utiliser l'API [[http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/docs-bulk.html BULK]] d'ElasticSearch pour procéder à l'indexation d'un très grand nombre d'adresses.
   
Attention, pour que la [[JDONREFv3ES_Query|requête]] du [[JDONREFv3ES_Plugin|plugin]] fonctionne correctement, certains champs doivent être correctement renseignés. L'[[JDONREFv3ES_Analyzer|analyzer]] fourni permet de remplir ce travail automatiquement.
+
Attention, pour que la [[JDONREFv4_Query|requête]] du [[JDONREFv4_Plugin|plugin]] fonctionne correctement, certains champs doivent être correctement renseignés. L'[[JDONREFv4_Analyzer|analyzer]] fourni permet de remplir ce travail automatiquement.
   
 
==== Recherches ====
 
==== Recherches ====
   
Une fois le contenu indexé, il vous est possible d'effectuer des [[JDONREFv3ES_Query|recherches]] à loisir !
+
Une fois le contenu indexé, il vous est possible d'effectuer des [[JDONREFv4_Query|recherches]] à loisir !
   
 
==== Debug ====
 
==== Debug ====
Ligne 204 : Ligne 209 :
 
curl -XPOST 'http://localhost:9200/jdonref/_search' -d '{
 
curl -XPOST 'http://localhost:9200/jdonref/_search' -d '{
 
"query": {
 
"query": {
"jdonrefv3es" : {
+
"jdonrefv4" : {
 
"value" : "24 BOULEVARD DE L HOPITAL 75005 PARIS",
 
"value" : "24 BOULEVARD DE L HOPITAL 75005 PARIS",
 
"debugDoc": 2154
 
"debugDoc": 2154

Version du 27 septembre 2014 à 02:25

L'utilisation du plugin JDONREFv4 nécessite :

  • de disposer d'un cluster elasticsearch !
  • de déployer le fichier de synonymes de JDONREFv4 (voir ici)
  • d'installer le plugin JDONREFv4 (voir ici)
  • puis d'indexer le contenu

Vous êtes ensuite libre d'effectuer les recherches souhaitées ! L'API elasticsearch peut bien sûr être utilisée, mais le plugin jdonrefv4 fourni un moyen de chercher efficacement des adresses (c'est à dire avec les résultats auxquels on devrait s'attendre). Cette page décrit une démarche possible en débutant par l'indexation du contenu.

Création de l'index

Commencez par vous créer un index en respectant la configuration fournie par le fichier jdonrefv4-settings.json de la sorte :

 curl -XPUT 'http://localhost:9200/jdonref/' -d '{
    "index" : {
       "analysis" : {
           "analyzer": {
               "jdonrefv4_index" : {
                   "type" : "custom",
                   "tokenizer" : "whitespace",
                   "filter" : ["delimited_payload_filter", "lowercase", "french_elision", "french_stop", /*/"french_keywords",*/ "french_stemmer","jdonrefv4_synonyme", "jdonrefv4_nGram"]
               },
               "jdonrefv4_codes_index" : {
                   "type" : "custom",
                   "tokenizer" : "standard",
                   "filter" : ["standard", "lowercase"]
               },
               "jdonrefv4_search" : {
                   "type" : "custom",
                   "tokenizer" : "standard",
                   "filter" : ["lowercase", "french_elision", "french_stop",/*/"french_keywords",*/ "french_stemmer"]
               }
           },
           "filter" : {
               "delimited_payload_filter" : {
                   "type": "delimited_payload_filter",
                   "delimiter" : "|",
                   "encoding" : "int"
               },
               "french_elision": {
                   "type":         "elision",
                   "articles": [ "l", "m", "t", "qu", "n", "s",
                                   "j", "d", "c", "jusqu", "quoiqu",
                                   "lorsqu", "puisqu"
                               ]
               },
               "french_stop": {
                   "type":       "stop",
                   "stopwords":  "_french_" 
               },
 //            "french_keywords": {
 //                "type":       "keyword_marker",
 //                "keywords":   [] 
 //            },
               "french_stemmer": {
                   "type":       "stemmer",
                   "language":   "light_french"
               },
 //            "jdonrefv3es_metaphone" : {
 //                "type" : "phonetic",
 //                "encoder" : "metaphone",
 //                "replace" : true
 //            },
               "jdonrefv4_synonyme" : {
                   "type" : "synonym",
                   "synonyms_path": "jdonrefv4_synonym.fr_FR.txt"
               },
               "jdonrefv4_nGram" : {
                   "type" : "jdonrefv4_edgengram",
                   "min_gram": 1,
                   "max_gram": 15,
                   "token_chars": ["digit"],
                   "withPayloads": true
               }
           },
           "similarity": {
               "jdonrefv4" : {
                   "type": "org.apache.lucene.search.similarities.JDONREFv4TermSimilarity"
               }
           }
       }
   }
 }'

A noter que le metaphone n'est plus utilisé pour le moment, car combiné au ngram, il introduit un trop grand nombre de faux positifs. Vous pouvez toutefois le mettre en place à votre guise. Le "french_keywords" peut être rétabli si vous notez quelques mots auxquels l'application du stemmer ne fournis pas de bons résultats.

Création des mappings

Pour que le plugin jdonrefv4 soit efficace, il s'agit de respecter les mappings fournis par jdonref. Cette opération est obligatoire pour que la requête de JDONREF puisse traiter correctement les données indexées.

Par exemple, pour que l'indexation de la géométrie se déroule correctement, les mappings auront du être définis au préalable, car ElasticSearch ne détecte pas automatiquement les géométries.

Vous avez peut-être aussi remarqué l'existence d'un champ calculé "codes". Si vous utilisez les mappings fournis, il se remplit automatiquement à partir du code_postal, code_insee, code_departement, code_arrondissement quelque soit l'objet considéré. Il est cependant vrai que dans le fond, vous pouvez vous en occuper vous-même.

Le champ "fullName" est lui aussi précalculé et contient l'ensemble des termes utilisé par la requête JDONREFv4. Il n'est ainsi pas uniquement la concaténation des champs ligne1, ligne4, et ligne6, mais dispose aussi des champs indexés dans "codes". Il permet d'effectuer un premier niveau de filtrage sur les résultats, très rapidement.

Enfin, le nom des types attribués à chaque mapping doit pour le moment être respecté. Dans le cas contraire, les malus ne pourront pas être appliqués.

Utiliser les synonymes

Le fichier de synonymes a normalement été utilisé à la création de votre index à partir du fichier jdonrev4_synonym.fr.txt.

La recherche pourra ainsi par exemple être effectuée avec le type de voie "BD" plutôt que "BOULEVARD". Attention toutefois, si vous modifiez ce fichier, il faut penser aussi à ré-indexer vos données.

Une autre stratégie consisterait à inverser le fonctionnement du fichier de synonyme pour l'utiliser durant la requête et non pas l'indexation. Le fichier de synonyme contiendrait alors des lignes commme :

 residence, res => residence

et la création de l'analyzer serait par exemple:

           "analyzer": {
               "jdonrefv4_index" : {
                   "type" : "custom",
                   "tokenizer" : "standard",
                   "filter" : ["standard", "lowercase", "jdonrefv4_nGram"]
               },
               "jdonrefv4_search" : {
                   "type" : "custom",
                   "tokenizer" : "standard",
                   "filter" : ["standard", "lowercase", "jdonrefv4_synonyme"]
               }
           },
Utiliser l'analyser

NB: l'analyzer n'est pas fourni dans les versions 0.1beta et 0.2

Si vous ne voulez pas remplir vous-même les champs "ligne4" et "ligne6", il vous sera possible d'utiliser l'analyzer fourni par jdonref :

 curl -XPUT 'http://localhost:9200/jdonref/' -d '{
   "analysis" : {
     "analyzer" : {
       "jdonrefv4": {
         "tokenizer": "whitespace"
       }
     }
   }
 }'

Si les lignes 4 et 6 ne sont pas spécifiées durant l'indexation, elles sont alors calculées à partir des autres champs disponibles.

Théoriquement, vous devriez pouvoir vous en sortir avec l'attribut copy_to d'elasticsearch.

Indexation du contenu

Il est ensuite possible d'indexer du contenu, comme une commune :

 curl -XPUT 'http://localhost:9200/jdonref/commune/1' -d '{
   "code_insee" : "75056",
   "code_departement" : "75",
   "code_pays" : "1",
   "commune" : "PARIS",
   "code_postal" : "75000",
   "ligne7" : "FRANCE",
   "type" : "commune",
   "t0" : "22/03/2014",
   "geometrie" : {
       "type": "multipolygon",
       "coordinates" : [
          [[102.0, 2.0], [103.0, 2.0], [103.0, 3.0], [102.0, 3.0], [102.0, 2.0]],
          [[100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0]],
          [[100.2, 0.2], [100.8, 0.2], [100.8, 0.8], [100.2, 0.8], [100.2, 0.2]]
       ]
   }
 }'

ou une voie :

 curl -XPUT 'http://localhost:9200/jdonref/voie/1' -d '{
   "numero_min": "1",
   "numero_max": "192",
   "type_de_voie": "BOULEVARD",
   "article": "DE",
   "voie": "HOPITAL",
   "code_insee_commune" : "75056",
   "code_postal" : "75013",
   "code_insee": "75113",
   "code_departement" : "75",
   "code_pays" : "FR1",
   "commune" : "PARIS",
   "ligne4" : "BOULEVARD DE L HOPITAL",
   "ligne6" : "75013 PARIS",
   "ligne7" : "FRANCE",
   "type": "voie",
   "t0" : "22/03/2014",
   "geometrie" : {
       "type": "multipolygon",
       "coordinates" : [
          [[102.0, 2.0], [103.0, 2.0], [103.0, 3.0], [102.0, 3.0], [102.0, 2.0]],
          [[100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0]],
          [[100.2, 0.2], [100.8, 0.2], [100.8, 0.8], [100.2, 0.8], [100.2, 0.2]]
       ]
   }
 }'
Indexation en masse

A noter qu'il est conseillé d'utiliser l'API [BULK] d'ElasticSearch pour procéder à l'indexation d'un très grand nombre d'adresses.

Attention, pour que la requête du plugin fonctionne correctement, certains champs doivent être correctement renseignés. L'analyzer fourni permet de remplir ce travail automatiquement.

Recherches

Une fois le contenu indexé, il vous est possible d'effectuer des recherches à loisir !

Debug

Pour les experts, un mode debug est disponible avec le paramètre debugDoc de la sorte :

 curl -XPOST 'http://localhost:9200/jdonref/_search' -d '{
   "query": {
     "jdonrefv4" : {
       "value" : "24 BOULEVARD DE L HOPITAL 75005 PARIS",
       "debugDoc": 2154
     }
   }
 }'

Cela permet d'afficher au niveau debug (niveau log4j), dans les logs d'elasticsearch, l'exécution détaillée du calcul de la note associée au document d'id "debugDoc". Il ne s'agit toutefois pas de l'id du document correspondant à _id, mais l'id du document relativement au shard considéré. Pour l'identifier, il suffit d'exécuter une requête dont le résultat inclus le document recherché, en mode explain (l'explication fait référence à l'id relatif au shard !).