Fork me on GitHub

Module gru indexing

Introduction

Ce plugin permet d'indexer des objets fr.paris.lutece.plugins.grubusiness.business.customer.Customer de la librairie gru-library-grubusiness. Une recherche sur les usagers peut alors être effectuée.

Ce plugin contient deux implémentations de l'indexation :

  • indexation avec Lucene : la recherche ne peut s'effectuer que sur le nom et/ou prénom de l'usager. C'est l'implémentation par défaut.
  • indexation avec Elasticsearch : la recherche peut s'effectuer sur l'ensemble des champs indexés.

Utiliser Lucene

Indexation

La classe gérant l'indexation est fr.paris.lutece.plugins.gruindexing.business.lucene.LuceneCustomerDAO. Elle est également configurée en tant que bean dans le contexte Spring. Elle peut être configurée :

  • Le premier argument du constructeur donne le chemin du dossier d'index. Par défaut, le dossier d'index est dans la webapp.
  • Le second argument du constructeur indique si le dossier d'index est dans la webapp (valeur = true) or non (valeur = false). Par défaut, la valeur est true.

Recherche

La classe gérant la recherche est fr.paris.lutece.plugins.gruindexing.business.lucene.LuceneCustomerDAO. Voir la section Indexing ci-dessus pour configurer la classe.

Seuls le nom et/ou le prénom peuvent être recherchés.

Recherche avec autocomplétion

La classe gérant la recherche avec autocomplétion est fr.paris.lutece.plugins.gruindexing.web.rs.lucene.LuceneAutoCompleteRestService. Elle est également configurée en tant que bean dans le contexte Spring. C'est un service web qui peut être appelé à l'URL /rest/lucene/autocomplete avec la méthode GET. Le paramètre query doit contenir les termes à rechercher.

Seuls le nom et/ou le prénom peuvent être recherchés.

L'autocomplétion retourne une chaîne de caractères JSON avec les champs suivants :

  • output : le texte affiché par l'autocomplétion. C'est toujours le prénom + nom de l'usager.
  • search : la liste des champs utilisés par la recherche. Pourquoi ce champ est présent : l'autocomplétion supprime les résultats en doublons. Par conséquent, quand un résultat est sélectionné, une seconde recherche peut être nécessaire pour afficher les résultats en doublons. La seconde recherche se base sur cette liste de champs. Il contient toujours le champ first_name et le champ last_name.
Voici un exemple :
{
  "autocomplete": [{
    "output": "John Doe",
    "search":{
      "first_name":"John",
      "last_name":"Doe"
    }
  }, {
    "output": "John Black",
    "search":{
      "first_name":"John",
      "last_name":"Black"
    }
  }]
}
                

Utiliser Elasticsearch

Avant d'utiliser Elasticsearch, il faut modifier les clés suivantes dans le fichier de propriétés :

  • gru-indexing.urlElk : l'URL du serveur Elasticsearch
  • gru-indexing.index : le nom de l'index Elasticsearch
  • gru-indexing.typeUser : le type d'index Elasticsearch pour les usagers

Indexation

La classe gérant l'indexation est fr.paris.lutece.plugins.gruindexing.business.elasticsearch.ElasticSearchCustomerDAO. Elle est également configurée en tant que bean dans le contexte Spring.

La requête d'indexation est définie dans le fichier WEB-INF/plugins/gruindexing/elasticsearch_customer_indexing.template. Elle contient des marques (comme ${user_cid}) qui sont remplacées par les valeurs réelles au moment de l'indexation. Certaines marques sont prédéfinies :

  • ${customer_id} : l'id de l'usager
  • ${connection_id} : l'id de connexion de l'usager
  • ${email} : l'adresse email de l'usager
  • ${last_name} : le nom de famille de l'usager
  • ${family_name} : le nom de jeune fille de l'usager
  • ${first_name} : le prénom de l'usager
  • ${mobile_phone_number} : le numéro de téléphone mobile de l'usager
  • ${fixed_phone_number} : le numéro de téléphone fixe de l'usager
  • ${birthday} : la date d'anniversaire de l'usager
  • ${civility} : la civilité de l'usager
Les autres marques sont retrouvées à partir des attributs supplémentaires de l'objet fr.paris.lutece.plugins.grubusiness.business.customer.Customer.

De la même façon, certains champs indexés sont prédéfinis :

  • customer_id : l'id de l'usager
  • connection_id : l'id de connexion de l'usager
  • email : l'adresse email de l'usager
  • last_name : le nom de famille de l'usager
  • family_name : le nom de jeune fille de l'usager
  • first_name : le prénom de l'usager
  • mobile_phone_number : le numéro de téléphone mobile de l'usager
  • fixed_phone_number : le numéro de téléphone fixe de l'usager
  • birthday : la date d'anniversaire de l'usager
  • civility : la civilité de l'usager
Les autres champs indexés peuvent être ajoutés selon les besoins.

Afin d'utiliser l'autocomplétion, le template doit contenir un champ suggest et un champ payload. Le champ suggest est un champ de complétion standard Elasticsearch. Le champ payload doit contenir les champs suivants :

  • output: le texte affiché par l'autocomplétion
  • search: la liste des champs utilisés par la recherche. Pourquoi ce champ est présent : l'autocomplétion supprime les résultats en doublons. Par conséquent, quand un résultat est sélectionné, une seconde recherche peut être nécessaire pour afficher les résultats en doublons. La seconde recherche se base sur cette liste de champs.
Avant la version 5.0 d'Elasticsearch, le champ payload doit être contenu dans le champ suggest. Voici un exemple :
"suggest":{
  "input":[
    "${first_name} ${last_name}",
    "${last_name} ${first_name}",
    "${telephoneNumber}",
    "${fixed_telephone_number}"
  ],
  "payload":{
    "output":"${first_name} ${last_name}",
    "search":{
      "first_name":"${first_name}",
      "last_name":"${last_name}"
    }
  }
}
                
Après la version 5.0 d'Elasticsearch, le champ payload doit être un champ du document, comme les autres champs. Voici un exemple :
"suggest":{
  "input":[
    "${first_name} ${last_name}",
    "${last_name} ${first_name}",
    "${telephoneNumber}",
    "${fixed_telephone_number}"
  ]
},
"payload":{
  "output":"${first_name} ${last_name}",
  "search":{
    "first_name":"${first_name}",
    "last_name":"${last_name}"
  }
}
                

Recherche

La classe gérant la recherche est fr.paris.lutece.plugins.gruindexing.business.elasticsearch.ElasticSearchCustomerDAO. Elle est également configurée en tant que bean dans le contexte Spring.

La recherche peut être configurée en modifiant les clés suivantes dans le fichier de propriétés :

  • gru-indexing.sizeSearchParamValue: le nombre de résultats retournés par la recherche

Recherche avec autocomplétion

La classe gérant la recherche avec autocomplétion est fr.paris.lutece.plugins.gruindexing.web.rs.elasticsearch.ElasticSearchAutoCompleteRestService. Elle est également configurée en tant que bean dans le contexte Spring. C'est un service web qui peut être appelé à l'URL /rest/elasticsearch/autocomplete avec la méthode GET. Le paramètre query doit contenir les termes à rechercher.

La requête d'autocomplétion est définie dans le fichier WEB-INF/plugins/gruindexing/elasticsearch_autocomplete.template. Elle contient une marque ${query} qui est remplacée par les termes à compléter au moment de la recherche.

On peut ajouter des marques personnalisées dans ce template. Afin de remplacer ces marques par leurs valeurs réelles, il suffit d'implémenter l'interface fr.paris.lutece.plugins.gruindexing.web.elasticsearch.template.IAutocompletePlaceholderFilter et de déclarer l'implémentation en tant que bean dans le contexte Spring.

L'autocomplétion retourne une chaîne de caractères JSON avec les champs suivants :

  • output : le champ output défini dans le fichier template d'indexation
  • search : le champ search défini dans le fichier template d'indexation
Voici un exemple :
{
  "autocomplete": [{
    "output": "John Doe",
    "search":{
      "first_name":"John",
      "last_name":"Doe"
    }
  }, {
    "output": "John Black",
    "search":{
      "first_name":"John",
      "last_name":"Black"
    }
  }]
}