Ressources

Paramètres de recherche communs

Lien vers la spécification FHIR : https://hl7.org/FHIR/search.html


1) Paramètres de recherche communs disponibles

Pour connaitre les différents paramètres de recherche pris en charge par le serveur FHIR, il est possible d’interroger le Capability Statement (metadata).

Requête :

GET [base]/metadata

2) Paramètres de type texte (string)

Les recherchers de type texte peuvent s’effectuer sur les différentes ressources disponibles.

Requête :

`GET [base]/Organization?name=Renard`
# Rechercher sur la raison sociale d'une structure

Exemples de code :

curl -H "ESANTE-API-KEY: XXXX-XXXX-XXXX-XXXXX" "https://gateway.api.esante.gouv.fr/fhir/v2/Organization?name=Renard"
// create the client:
var client = FhirTestUtils.createClient();

// create the name search parameter :
var matchSearchClause = Organization.NAME.matches().value("Renard");

var bundle = client.search()
        .forResource(Organization.class)
        .where(matchSearchClause)
        .returnBundle(Bundle.class).execute();

for (var organizationEntry : bundle.getEntry()) {
    // cast entry :
    var organization = (Organization) organizationEntry.getResource();
    // print data :
    logger.info("Organization found: name={}", organization.getName());
}
// create the client:
var client = FhirTestUtils.CreateClient();
// create the name search parameter :
var q = new SearchParams()
  .Where("name=Renard")
  .LimitTo(50);
var bundle = client.Search<Organization>(q);
foreach (var be in bundle.Entry)
{
    // print ids:
    var organization = be.Resource as Organization;
    Console.WriteLine($"Organization found: name={organization.Name}");
}


 

Il est également possible sur des attributs de type texte (String) d’utiliser les modifiers contains et exact pour affiner la recherche :

Requêtes :

GET [base]/Organization?name%3Acontains=MIGNOT
# Le modificateur :contains retourne les résultats qui incluent la valeur MIGNOT n'importe où dans le champ recherché.

GET [base]/Organization?name%3Aexact=MIGNOT
# Le modificateur :exact retourne les résultats qui correspondent exactement à l'ensemble du paramètre fourni, y compris la casse et les accents.

Exemples de code :

curl -H "ESANTE-API-KEY: XXXX-XXXX-XXXX-XXXXX" "https://gateway.api.esante.gouv.fr/fhir/v2/Organization?name%3Acontains=MIGNOT"
// create the client:
var client = FhirTestUtils.createClient();

// create the name search parameter :
var containsSearchClause = Organization.NAME.contains().value("MIGNOT");

var bundle = client.search()
.forResource(Organization.class)
.where(containsSearchClause)
.returnBundle(Bundle.class).execute();

for (var organizationEntry : bundle.getEntry()) {
// cast entry :
var organization = (Organization) organizationEntry.getResource();
// print data :
logger.info("Organization found: name={}", organization.getName());
}
// create the client:
var client = FhirTestUtils.CreateClient();
// create the name search parameter :
var q = new SearchParams()
  .Where("name:contains=MIGNOT")
  .LimitTo(50);
var bundle = client.Search<Organization>(q);
foreach (var be in bundle.Entry)
{
    // print ids:
    var organization = be.Resource as Organization;
    Console.WriteLine($"Organization found: name={organization.Name}");
}


3) Paramètres de type token

Les paramètres de recherche de type TOKEN permettent de rechercher en fonction :

  • du Code Système
  • de l’identifiant (ou code)
  • ou des deux

Recherche par code

Requête :

GET [base]/Organization?identifier=https%3A%2F%2Ffiness.esante.gouv.fr%7C
# Rechercher par rapport au code système de FINESS. Cela permettra de remonter l'ensemble des structures provenant du SI (Système d'Information) de FINESS.

GET [base]/Organization?identifier=org-org-148
# Rechercher par rapport à l'identifiant de la structure org-org-148.

GET [base]/PractitionerRole?role=https%3A%2F%2Fmos.esante.gouv.fr%2FNOS%2FTRE_R85-RolePriseCharge%2FFHIR%2FTRE-R85-RolePriseCharge%7C318
# Rechercher par rapport au code système TRE R85 Role Prise Charge et en filtrant sur le code 318 correspondant aux Auxiliaires de vie

Exemples de code :

curl -H "ESANTE-API-KEY: XXXX-XXXX-XXXX-XXXXX" "https://gateway.api.esante.gouv.fr/fhir/v2/Organization?identifier=org-org-148"
// create the client:
var client = FhirTestUtils.createClient();

// create the name search parameter :
var tokenSearchClause = Organization.IDENTIFIER.exactly().code("org-org-148");

var bundle = client.search()
.forResource(Organization.class)
.where(tokenSearchClause)
.returnBundle(Bundle.class).execute();

for (var organizationEntry : bundle.getEntry()) {
// cast entry :
var organization = (Organization) organizationEntry.getResource();
// print data :
logger.info("Organization found: id={} name={}", organization.getIdElement().getIdPart(), organization.getName());
}
// create the client:
var client = FhirTestUtils.CreateClient();
// create the name search parameter :
var q = new SearchParams()
  .Where("identifier=org-org-148")
  .LimitTo(50);
var bundle = client.Search<Organization>(q);
foreach (var be in bundle.Entry)
{
    // print ids:
    var organization = be.Resource as Organization;
    Console.WriteLine($"Organization found: id={organization.IdElement.Value} name={organization.Name}");
}


4) Paramètres de type date

La recherche par date supporte les préfixes suivants:

Préfix Nom Description
eq equal La valeur du paramètre dans la ressource est égale à la valeur saisie
ne not equal La valeur du paramètre dans la ressource n’est pas égale à la valeur saisie
gt greater La valeur du paramètre dans la ressource est supérieure à la valeur saisie
lt less La valeur du paramètre dans la ressource est inférieure à la valeur saisie
ge greater or equal La valeur du paramètre dans la ressource est supérieure ou égale à la valeur saisie
le less or equal La valeur du paramètre dans la ressource est inférieure ou égale à la valeur saisie
sa starts after La valeur du paramètre dans la ressource démarre après la valeur saisie
eb ends before La valeur du paramètre dans la ressource termine avant la valeur saisie
ap approximately La valeur du paramètre dans la ressource est approximativement la même que la valeur fournie. Il est à noter que la valeur recommandée pour l’approximation est de 10% de la valeur indiquée

Plus d’informations sur les [dates] (https://build.fhir.org/search.html#date)

Plusiseurs “précisions” sont supportées : yyyy par année, yyyy-MM-dd par jour, et par date complète.

Quelques exemples :

  • _lastUpdated=gt2020 : après 2020
  • _lastUpdated=ge2020 : 2020 et après (2020 inclus)
  • _lastUpdated=lt2022-12-15 : avant le 15 décembre 2022 exclus
  • _lastUpdated=lt2022-12-15T15:00:00 : avant le 15 décembre 2022 15h (GMT)
  • _lastUpdated=eq2021 : durant l’année 2021

 

Requête :

GET [base]/Organization?_lastUpdated=ge2022-08-05T14%3A51%3A04


Exemples de code :

curl -H "ESANTE-API-KEY: XXXX-XXXX-XXXX-XXXXX" "https://gateway.api.esante.gouv.fr/fhir/v2/Organization?_lastUpdated=ge2022-08-05T14%3A51%3A04" 
// create the client:
var client = FhirTestUtils.createClient();

// create the date search parameter :
var dateParam = new DateClientParam("_lastUpdated");

var bundle = client.search()
.forResource(Organization.class)
.where(dateParam.afterOrEquals().second("2022-08-05T14:51:04"))
.returnBundle(Bundle.class).execute();

for(var organizationEntry : bundle.getEntry()){
// cast entry :
var organization = (Organization) organizationEntry.getResource();
// print update date & id :
logger.info("Organization found: id={} lastUpdate={}", organization.getIdElement().getIdPart(), organization.getMeta().getLastUpdated());
}
// create the client:
var client = FhirTestUtils.CreateClient();
// create the name search parameter :
var q = new SearchParams()
  .Where("_lastUpdated=ge2022-08-05T14:51:04")
  .LimitTo(50);
var bundle = client.Search<Organization>(q);
foreach (var be in bundle.Entry)
{
    // print ids:
    var organization = be.Resource as Organization;
    Console.WriteLine($"Organization found: id={organization.IdElement.Value} lastUpdate={organization.Meta.LastUpdated.Value}");
}


7) Paramètres combinés

Les paramètres combinés permettent d’effectuer des recherches en les cumulant. Ce cumul se fait de manière inclusive ou alternative.

7.1) Paramètres ET (AND)

Requête :

GET [base]/Organization?name:contains=ANDRE&name:contains=MIGNOT

Exemples de code:

curl -H# "ESANTE-API-KEY: XXXX-XXXX-XXXX-XXXXX" "https://gateway.api.esante.gouv.fr/fhir/v2/Organization?name%3Acontains=ANDRE&name%3Acontains=MIGNOT"
// create the client:
var client = FhirTestUtils.createClient();

// create the two name search parameters :
var firstSearchClause = Organization.NAME.contains().value("ANDRE");
var secondSearchClause = Organization.NAME.contains().value("MIGNOT");

var bundle = client.search()
        .forResource(Organization.class)
        .where(firstSearchClause)
        .and(secondSearchClause)
        .returnBundle(Bundle.class).execute();

for (var organizationEntry : bundle.getEntry()) {
    // cast entry :
    var organization = (Organization) organizationEntry.getResource();
    // print data :
    logger.info("Organization found: id={} | name={}", organization.getIdElement().getIdPart(), organization.getName());
}
// create the client:
var client = FhirTestUtils.CreateClient();
// create the name search parameter :
var q = new SearchParams()
  .Where("name:contains=ANDRE").Add("name:contains", "MIGNOT")
  .LimitTo(50);
var bundle = client.Search<Organization>(q);
foreach (var be in bundle.Entry)
{
// print ids:
    var organization = be.Resource as Organization;
    Console.WriteLine($"Organization found: id={organization.IdElement.Value} | name={organization.Name}");
}


7.2) Paramètres OU (OR)

Requête :

GET [base]/Organization?name%3Acontains=ANDRE%2CMIGNOT


Exemples de code:

curl -H "ESANTE-API-KEY: XXXX-XXXX-XXXX-XXXXX" "https://gateway.api.esante.gouv.fr/fhir/v2/Organization?name%3Acontains=ANDRE%2CMIGNOT"
// create the client:
var client = FhirTestUtils.createClient();

// create the two name search parameters :
var orSearchClause = Organization.NAME.contains().values("ANDRE", "MIGNOT");

var bundle = client.search()
        .forResource(Organization.class)
        .where(orSearchClause)
        .returnBundle(Bundle.class).execute();

for (var organizationEntry : bundle.getEntry()) {
    // cast entry :
    var organization = (Organization) organizationEntry.getResource();
    // print data :
    logger.info("Organization found: id={} | name={}", organization.getIdElement().getIdPart(), organization.getName());
}
// create the client:
var client = FhirTestUtils.CreateClient();
// create the name search parameter :
var q = new SearchParams()
  .Where("name:contains=ANDRE,MIGNOT")
  .LimitTo(50);
var bundle = client.Search<Organization>(q);
foreach (var be in bundle.Entry)
{
    // print ids:
    var organization = be.Resource as Organization;
    Console.WriteLine($"Organization found: id={organization.IdElement.Value} | name={organization.Name}");
}