Ressources

Paramètres de recherche

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


1) Paramètres de recherche disponibles

Pour afficher les paramètres de recherche pris en charge par l’API, vous pouvez interroger le CapabilityStatement.

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.

2.1) Recherche sans “modifier”

Requête :

GET [base]/Organization?name=Renard

Réponse (simplifiée) : 

HTTP 200 OK
  resourceType: Bundle
  type: searchset
  Organization found: name=Renard et Renard
  Organization found: name=Renard SCOP
  Organization found: name=Renard EURL



Exemples de code :

curl -H "ESANTE-API-KEY: XXXX-XXXX-XXXX-XXXXX" "https://gateway.api.esante.gouv.fr/fhir/v1/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());
}
$response = $client->request('GET', '/fhir/v1/Organization?name=Renard');
/** @var  $organizations  \DCarbone\PHPFHIRGenerated\R4\FHIRResource\FHIRBundle*/
$organizations = $parser->parse((string) $response->getBody());
foreach($organizations->getEntry() as $entry){
    /** @var  $organization  \DCarbone\PHPFHIRGenerated\R4\FHIRResource\FHIRDomainResource\FHIROrganization */
    $organization = $entry->getResource();

    echo("Organization found: name=".$organization->getName()."\n");
}
// 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}");
}


2.2) Recherche avec le “modifier” “contains”

Requête :

GET [base]/Organization?name%3Acontains=EURL

Réponse (simplifiée) : 

HTTP 200 OK
  resourceType: Bundle
  type: searchset
  Organization found: name=Perez EURL
  Organization found: name=Gautier EURL



Exemples de code :

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

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

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());
}
$response = $client->request('GET', '/fhir/v1/Organization?name%3Acontains=EURL');
/** @var  $organizations  \DCarbone\PHPFHIRGenerated\R4\FHIRResource\FHIRBundle*/
$organizations = $parser->parse((string) $response->getBody());
foreach($organizations->getEntry() as $entry){
    /** @var  $organization  \DCarbone\PHPFHIRGenerated\R4\FHIRResource\FHIRDomainResource\FHIROrganization */
    $organization = $entry->getResource();

    echo("Organization found: name=".$organization->getName()."\n");
}
// create the client:
var client = FhirTestUtils.CreateClient();
// create the name search parameter :
var q = new SearchParams()
  .Where("name:contains=EURL")
  .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}");
}


2.3) Recherche avec le “modifier” “exact”

Requête :

GET [base]/Organization?name%3Aexact=Gautier%20EURL

Réponse (simplifiée) : 

HTTP 200 OK
  resourceType: Bundle
  type: searchset
  Organization found: id=org-183 name=Gautier EURL
  Organization found: id=org-358 name=Gautier EURL



Exemples de code :

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

// create the name search parameter :
var exactSearchClause = Organization.NAME.matchesExactly().value("Gautier EURL");

var bundle = client.search()
        .forResource(Organization.class)
        .where(exactSearchClause)
        .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());
}
$response = $client->request('GET', '/fhir/v1/Organization?name%3Aexact=Gautier%20EURL');
/** @var  $organizations  \DCarbone\PHPFHIRGenerated\R4\FHIRResource\FHIRBundle*/
$organizations = $parser->parse((string) $response->getBody());
foreach($organizations->getEntry() as $entry){
    /** @var  $organization  \DCarbone\PHPFHIRGenerated\R4\FHIRResource\FHIRDomainResource\FHIROrganization */
    $organization = $entry->getResource();

    echo("Organization found: id=".$organization->getId()." name=".$organization->getName()."\n");
}
// create the client:
var client = FhirTestUtils.CreateClient();
// create the name search parameter :
var q = new SearchParams()
  .Where("name:exact=Gautier EURL")
  .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}");
}


3) Paramètres de type token

Le serveur supporte la recherche par code, par système ou par les deux.

Recherche par code

Requête :

GET [base]/Organization?identifier=org-org-148

Réponse (simplifiée) : 

HTTP 200 OK
  resourceType: Bundle
  type: searchset
  Organization found: id=org-148 name=Renard et Renard



Exemples de code :

curl -H "ESANTE-API-KEY: XXXX-XXXX-XXXX-XXXXX" "https://gateway.api.esante.gouv.fr/fhir/v1/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());
}
$response = $client->request('GET', '/fhir/v1/Organization?identifier=org-org-148');
/** @var  $organizations  \DCarbone\PHPFHIRGenerated\R4\FHIRResource\FHIRBundle*/
$organizations = $parser->parse((string) $response->getBody());
foreach($organizations->getEntry() as $entry){
    /** @var  $organization  \DCarbone\PHPFHIRGenerated\R4\FHIRResource\FHIRDomainResource\FHIROrganization */
    $organization = $entry->getResource();

    echo("Organization found: id=".$organization->getId()." name=".$organization->getName()."\n");
}
// 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

Réponse (simplifiée) : 

HTTP 200 OK
  resourceType: Bundle
  type: searchset
  Organization found: id=org-148 lastUpdate=Fri Aug 05 14:51:03 CEST 2022
  Organization found: id=org-149 lastUpdate=Fri Aug 05 14:51:03 CEST 2022
  Organization found: id=org-144 lastUpdate=Fri Aug 05 14:51:03 CEST 2022
  Organization found: id=org-386 lastUpdate=Fri Aug 05 14:51:03 CEST 2022
  Organization found: id=org-145 lastUpdate=Fri Aug 05 14:51:03 CEST 2022



Exemples de code :

curl -H "ESANTE-API-KEY: XXXX-XXXX-XXXX-XXXXX" "https://gateway.api.esante.gouv.fr/fhir/v1/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());
}
$response = $client->request('GET', '/fhir/v1/Organization?_lastUpdated=ge2022-08-05T14%3A51%3A04');
/** @var  $organizations  \DCarbone\PHPFHIRGenerated\R4\FHIRResource\FHIRBundle*/
$organizations = $parser->parse((string) $response->getBody());
foreach($organizations->getEntry() as $entry){
    /** @var  $organization  \DCarbone\PHPFHIRGenerated\R4\FHIRResource\FHIRDomainResource\FHIROrganization */
    $organization = $entry->getResource();

    echo("Organization found: id=".$organization->getId()." lastUpdate=".$organization->getMeta()->getLastUpdated()."\n");
}
// 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}");
}


5) Paramètres de type référence (reference)

Cette partie de la spécification est en cours de construction.

6) Paramètres de type uri

Cette partie de la spécification est en cours de construction.

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%3Acontains=Renard&name%3Acontains=et

Réponse (simplifiée) : 

HTTP 200 OK
  resourceType: Bundle
  type: searchset
  Organization found: id=org-148 | name=Renard et Renard
  Organization found: id=org-176 | name=Renard et Renard
Organization found: id=org-128 | name=Renard et Renard



Exemples de code:

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

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

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());
}
$response = $client->request('GET', '/fhir/v1/Organization?name%3Acontains=Renard&name%3Acontains=et');
/** @var  $organizations  \DCarbone\PHPFHIRGenerated\R4\FHIRResource\FHIRBundle*/
$organizations = $parser->parse((string) $response->getBody());
foreach($organizations->getEntry() as $entry){
    /** @var  $organization  \DCarbone\PHPFHIRGenerated\R4\FHIRResource\FHIRDomainResource\FHIROrganization */
    $organization = $entry->getResource();

    echo("Organization found: id=".$organization->getId()." | name=".$organization->getName()."\n");
}
// create the client:
var client = FhirTestUtils.CreateClient();
// create the name search parameter :
var q = new SearchParams()
  .Where("name:contains=Renard").Add("name:contains", "et")
  .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=Renard%2Cet

Réponse (simplifiée) : 

HTTP 200 OK
  resourceType: Bundle
  type: searchset
  Organization found: id=org-148 | name=Renard et Renard
  Organization found: id=org-386 | name=Lopez et Lopez
  Organization found: id=org-145 | name=Maillard et Maillard



Exemples de code:

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

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

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());
}
$response = $client->request('GET', '/fhir/v1/Organization?name%3Acontains=Renard%2Cet');
/** @var  $organizations  \DCarbone\PHPFHIRGenerated\R4\FHIRResource\FHIRBundle*/
$organizations = $parser->parse((string) $response->getBody());
foreach($organizations->getEntry() as $entry){
    /** @var  $organization  \DCarbone\PHPFHIRGenerated\R4\FHIRResource\FHIRDomainResource\FHIROrganization */
    $organization = $entry->getResource();

    echo("Organization found: id=".$organization->getId()." | name=".$organization->getName()."\n");
}
// create the client:
var client = FhirTestUtils.CreateClient();
// create the name search parameter :
var q = new SearchParams()
  .Where("name:contains=Renard,et")
  .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}");
}


8) Paramètres des résultats de la recherche

Il s’agit d’un ensemble de paramètres permettant de gérer les résultats retournés par une recherche. Vous trouverez ci-dessous la liste des paramètres de résultats de recherche pris en charge dans notre contexte.

8.1) Paramètre “_count”

Il permet de contrôler le nombre maximal de ressources retournées sur une page lorsqu’une réponse de l’API est paginée. Par exemple, _count=10 renvoie un maximum de 10 ressources. La valeur par défaut est 50.

Requête:

GET [base]/Device?_count=200

8.2) Paramètre “_total”

Comme son nom l’indique, ce paramètre indique le nombre total d’éléments (ressources) qui correspondent aux critères de recherche. Ce paramètre peut prendre 3 valeurs : none, estimate ou accurate.

  • none : le total n’est pas affiché
  • estimate : le total affiché est une estimation
  • accurate : le total affiché est précis

 

Cet exemple montre comment utiliser le paramètre _total=none pour ne pas afficher le total :

Requête:

GET [base]/Device?_total=none

Par défaut, l’affichage (ou pas) du total dépend principalement du temps nécessaire à son calcul. Ainsi, si le temps de calcul est trop important, le total ne sera pas inclus dans la réponse. Dans la majorité des cas, le total est affiché sauf dans certains cas particuliers, comme les recherches textuelles (champs de type string) sur de gros volumes de données. Par exemple, rechercher tous les PractitionerRole ayant un nom d’exercice contenant « Martin ».

8.2) Paramètre “include”

Le paramètre _include permet d’afficher dans le résultat les ressources mères liées à la ressource fille. La/Les ressource(s) mère(s) es/sont récupérée(s) à partir de la ressource fille.

Exemples:

GET [base]/PractitionerRole?_include=PractitionerRole:organization

Cette requête par exemple remonte les PractitionerRole ainsi que les Oganization auxquelles ils sont rattachés.

8.2) Paramètre “revinclude”

Le paramètre _revinclude permet d’afficher dans le résultat les ressources filles liées à la ressource mère. La/Les ressource(s) filles est/sont récupérée(s) à partir de la ressource mère.

Exemples:

GET [base]/Organization?_revinclude=Organization:partof

Cette requête par exemple remonte les Entités Géographiques (EG) et les Entités Juridiques (EJ) de rattachement.

8.2) Paramètre “_elements”

Le paramètre _elements permet de préciser la liste d’attributs qui doit être retournée avec la ressource.

Exemples:

GET [base]/Practitioner?_elements=identifier,active

Dans la requête ci-dessus, la réponse retournée contiendra un lot de practitioner, mais chaque entrée n’inclura que les attributs identifier et active du practitioner.

A noter que la réponse contient également une meta.tag valeur de SUBSETTED pour indiquer que tous les attributs de la ressource ne sont pas inclus.


...
                    "tag": [
                        {
                            "system": "http://terminology.hl7.org/CodeSystem/v3-ObservationValue",
                            "code": "SUBSETTED",
                            "display": "Resource encoded in summary mode"
                        }
                    ]
                },
                "identifier": [
                    {
                        "use": "official",
                        "type": {
                            "coding": [
                                {
                                    "system": "http://interopsante.org/CodeSystem/v2-0203",
                                    "code": "IDNPS"
                                }
                            ]
                        },
                        "system": "urn:oid:1.2.250.1.71.4.2.1",
                        "value": "810000001916"
                    },
                    {
                        "use": "official",
                        "type": {
                            "coding": [
                                {
                                    "system": "http://interopsante.org/CodeSystem/v2-0203",
                                    "code": "RPPS"
                                }
                            ]
                        },
                        "system": "http://rpps.fr",
                        "value": "10000001916"
                    }
                ],
                "active": true
...

 

Code source des exemples

Vous retrouverez le code source de ces exemples sur notre repository git: