Rechercher des ressources FHIR

Cette page explique les instructions de base pour rechercher des ressources FHIR dans un magasin FHIR. La recherche de ressources FHIR est le principal moyen d'interroger des données FHIR et d'en obtenir des insights.

Vous pouvez rechercher des ressources FHIR dans l'API Cloud Healthcare de la manière suivante :

Cette page présente un aperçu des nombreuses fonctionnalités de recherche couramment utilisées, mais ne constitue pas une liste exhaustive des parties des spécifications de recherche FHIR compatibles avec l'API Cloud Healthcare.

Utiliser le lecteur FHIR

La visionneuse FHIR est une page de la console Google Cloud qui vous permet de rechercher et d'afficher le contenu des ressources FHIR.

Pour rechercher des ressources dans un store FHIR, procédez comme suit :

  1. Dans la console Google Cloud, accédez à la page Visionneuse FHIR.

    Accéder au lecteur FHIR

  2. Dans la liste déroulante Magasin FHIR, sélectionnez un ensemble de données, puis sélectionnez un magasin FHIR dans l'ensemble de données.

  3. Pour filtrer la liste des types de ressources, recherchez les types de ressources que vous souhaitez afficher :

    1. Cliquez sur le champ Type de ressource.

    2. Dans la liste déroulante Propriétés qui s'affiche, sélectionnez Type de ressource.

    3. Saisissez un type de ressource.

    4. Pour rechercher un autre type de ressource, sélectionnez OU dans la liste déroulante Opérateurs qui s'affiche, puis saisissez un autre type de ressource.

  4. Dans la liste des types de ressources, sélectionnez le type de ressource sur lequel vous souhaitez effectuer la recherche.

  5. Dans le champ de recherche de la table des ressources qui s'affiche, saisissez la valeur que vous souhaitez rechercher.

Le lecteur FHIR affiche les résultats de la recherche dans une table. Une fois que vous avez sélectionné une ressource, le lecteur FHIR affiche le contenu de la ressource.

Lorsque vous affichez le contenu d'une ressource, vous pouvez rechercher des données dans la ressource.

Pour rechercher des données dans une ressource, procédez comme suit :

  1. Sélectionnez une ressource.

  2. Dans le volet Lecteur FHIR, cliquez sur l'onglet Éléments.

  3. Dans le champ de recherche, saisissez la valeur que vous souhaitez rechercher.

Télécharger des données binaires dans des ressources FHIR

Pour télécharger les données binaires disponibles associées à une ressource dans la visionneuse FHIR, procédez comme suit :

  1. Sélectionnez une ressource

  2. Dans le volet Lecteur FHIR, cliquez sur l'onglet Éléments.

  3. Si nécessaire, développez les éléments pour accéder à l'élément de ressource requis.

  4. Cliquez sur Télécharger le fichier pour télécharger les données disponibles.

Créer et exécuter des requêtes de recherche avancée

Vous pouvez utiliser des requêtes de recherche avancée pour rechercher des ressources FHIR spécifiques à l'aide de la spécification de recherche FHIR.

Pour créer une requête de recherche avancée, procédez comme suit :

  1. Sur la page Visionneuse FHIR, cliquez sur l'onglet Rechercher.

  2. Pour créer une requête de recherche, cliquez sur Ouvrir le générateur de requêtes.

    Le panneau Sélection de requête s'affiche.

  3. Dans la liste Sélectionner un type de ressource FHIR, choisissez le type de ressource FHIR. type de ressource que vous souhaitez rechercher.

  4. Cliquez sur Continuer.

  5. Dans la liste Paramètre, sélectionnez le paramètre que vous souhaitez utiliser pour rechercher des ressources.

  6. Dans la liste Modifier, sélectionnez le modificateur à appliquer au requête. La liste n'inclut que les modificateurs compatibles avec le type de données du paramètre sélectionné.

    Cette sélection est facultative. Si aucun modificateur n'est sélectionné, une vérification d'égalité est effectuée.

  7. Dans le champ Valeur, saisissez la valeur du paramètre de requête.

  8. Pour ajouter plusieurs valeurs de paramètre, cliquez sur OU. Cela vous permet d'inclure plusieurs valeurs de votre paramètre de ressource dans votre requête de recherche.

    Lorsque vous créez une requête de recherche, celle-ci s'affiche dans le volet Aperçu de la requête. Pour afficher l'URL complète de la requête de recherche, cliquez sur Afficher le chemin d'accès complet.

  9. Pour ajouter plusieurs paramètres, cliquez sur ET.

  10. Cliquez sur Continuer.

  11. Pour inclure des ressources référencées par les ressources renvoyées dans votre requête de recherche, choisissez le paramètre de ressource dans la liste déroulante Paramètres inclus.

  12. Pour inclure des ressources qui référencent les ressources renvoyées dans votre requête de recherche, sélectionnez le paramètre de ressource dans la liste déroulante Paramètres inversés inclus.

  13. Cliquez sur OK pour enregistrer votre requête de recherche.

    La requête de recherche enregistrée s'affiche dans le champ Opération de recherche FHIR.

  14. Pour rechercher des ressources à l'aide de la requête, cliquez sur Exécuter la recherche.

    Les résultats de la recherche s'affichent dans la liste Résultats de recherche. Pour afficher les détails d'une ressource renvoyée par la recherche, cliquez sur une ressource dans la liste.

  15. Pour enregistrer la requête en tant que modèle de requête, cliquez sur Enregistrer le modèle, puis sélectionnez Enregistrer le modèle ou Enregistrer le modèle sous. Vous êtes invité à saisir un nom et une description pour la requête. Les paramètres de requête sont enregistrés dans un modèle, mais toutes les valeurs définies sont supprimées.

Exemple de requête de recherche

L'exemple suivant montre une requête de recherche qui porte sur les ressources Claim auprès d'un prestataire de santé spécifique, Practitioner/12345, pour le mois d'août 2021 :

  • Paramètre : care-team
    • Valeur : Practitioner/12345
  • Opérateur : AND
  • Paramètre : created
    • Préfixe : lt (lesser than)
    • Valeur : 8/1/21, 12:00 AM
  • Opérateur : AND
  • Paramètre : created
    • Préfixe : gt (greater than)
    • Valeur : 8/31/21, 11:59 PM

La configuration s'effectue comme suit dans le panneau Sélection de requête, et la requête est prévisualisée dans le volet Aperçu de la requête. La requête sera affichée dans le champ Opération de recherche FHIR.

Requête de recherche avancée FHIR

Modifier des requêtes de recherche

Pour modifier une requête de recherche, effectuez l'une des opérations suivantes :

  • Pour modifier la requête dans le générateur de requêtes, cliquez sur Ouvrir le générateur de requêtes.
  • Pour modifier manuellement la requête, modifiez les valeurs des paramètres dans la zone de texte.

Exécuter des modèles de requête

Pour exécuter une requête à partir d'un modèle enregistré, procédez comme suit :

  1. Cliquez sur Modèles enregistrés.

    L'onglet Rechercher des modèles du panneau Sélection de requête affiche tous les modèles de requête enregistrés.

  2. Sélectionnez le modèle de requête que vous souhaitez exécuter, puis cliquez sur OK.

    La requête de recherche du modèle s'affiche dans le champ Opération de recherche FHIR sans aucune valeur.

  3. Pour définir les valeurs de votre requête de recherche, modifiez les valeurs des paramètres dans le champ.

  4. Cliquez sur Exécuter la recherche pour rechercher des ressources à l'aide de la requête.

Utiliser la méthode search

Pour rechercher des ressources FHIR avec l'API REST, utilisez la méthode projects.locations.datasets.fhirStores.fhir.search. Vous pouvez appeler la méthode à l'aide de requêtes GET ou POST.

Utiliser la méthode search avec GET

Les exemples suivants montrent comment rechercher des ressources dans un datastore FHIR donné à l'aide de la méthode projects.locations.datasets.fhirStores.fhir.search avec GET.

curl

Pour rechercher des ressources dans un datastore FHIR, envoyez une requête GET et spécifiez les informations suivantes :

  • Le nom de l'ensemble de données
  • Le nom du datastore FHIR
  • Le type de ressource à rechercher
  • Une chaîne de requête contenant les informations que vous recherchez, comme décrit dans la section Créer une requête de recherche
  • Un jeton d'accès

L'exemple suivant montre une requête GET utilisant curl pour rechercher tous les patients portant le nom de famille "Smith".

curl -X GET \
     -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
     "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Patient?family:exact=Smith"

Si la requête aboutit, le serveur renvoie la réponse en tant que Bundle FHIR au format JSON. Le Bundle.type est searchset et les résultats de recherche sont des entrées du tableau Bundle.entry. Dans cet exemple, la requête renvoie une seule ressource "Patient" incluant les données qu'elle contient :

{
  "entry": [
    {
      "fullUrl": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Patient/PATIENT_ID",
      "resource": {
        "birthDate": "1970-01-01",
        "gender": "female",
        "id": "PATIENT_ID",
        "meta": {
          "lastUpdated": "LAST_UPDATED",
          "versionId": "VERSION_ID"
        },
        "name": [
          {
            "family": "Smith",
            "given": [
              "Darcy"
            ],
            "use": "official"
          }
        ],
        "resourceType": "Patient"
      },
      "search": {
        "mode": "match"
      }
    }
  ],
  "link": [
    {
      "url": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Patient/?family%3Aexact=Smith"
    }
  ],
  "resourceType": "Bundle",
  "total": 1,
  "type": "searchset"
}

PowerShell

Pour rechercher des ressources dans un datastore FHIR, envoyez une requête GET et spécifiez les informations suivantes :

  • Le nom de l'ensemble de données
  • Le nom du datastore FHIR
  • Le type de ressource à rechercher
  • Une chaîne de requête contenant les informations que vous recherchez, comme décrit dans la section Créer une requête de recherche
  • Un jeton d'accès

L'exemple suivant montre une requête GET utilisant Windows PowerShell pour rechercher tous les patients portant le nom de famille "Smith".

$cred = gcloud auth application-default print-access-token
$headers = @{ Authorization = "Bearer $cred" }

Invoke-RestMethod `
  -Method Get `
  -Headers $headers `
  -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/RESOURCE_TYPE?family:exact=Smith" | ConvertTo-Json

Si la requête aboutit, le serveur renvoie la réponse en tant que Bundle FHIR au format JSON. Le Bundle.type est searchset et les résultats de recherche sont des entrées du tableau Bundle.entry. Dans cet exemple, la requête renvoie une seule ressource "Patient" incluant les données qu'elle contient :

{
  "entry": [
    {
      "fullUrl": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Patient/PATIENT_ID",
      "resource": {
        "birthDate": "1970-01-01",
        "gender": "female",
        "id": "PATIENT_ID",
        "meta": {
          "lastUpdated": "LAST_UPDATED",
          "versionId": "VERSION_ID"
        },
        "name": [
          {
            "family": "Smith",
            "given": [
              "Darcy"
            ],
            "use": "official"
          }
        ],
        "resourceType": "Patient"
      },
      "search": {
        "mode": "match"
      }
    }
  ],
  "link": [
    {
      "url": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Patient/?family%3Aexact=Smith"
    }
  ],
  "resourceType": "Bundle",
  "total": 1,
  "type": "searchset"
}

Java

import com.google.api.client.http.HttpRequestInitializer;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.services.healthcare.v1.CloudHealthcare;
import com.google.api.services.healthcare.v1.CloudHealthcareScopes;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.Collections;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.methods.RequestBuilder;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.HttpClients;

public class FhirResourceSearchGet {
  private static final String FHIR_NAME =
      "projects/%s/locations/%s/datasets/%s/fhirStores/%s/fhir/%s";
  // The endpoint URL for the Healthcare API. Required for HttpClient.
  private static final String API_ENDPOINT = "https://healthcare.googleapis.com";
  private static final JsonFactory JSON_FACTORY = new GsonFactory();
  private static final NetHttpTransport HTTP_TRANSPORT = new NetHttpTransport();

  public static void fhirResourceSearchGet(String resourceName)
      throws IOException, URISyntaxException {
    // String resourceName =
    //    String.format(
    //        FHIR_NAME, "project-id", "region-id", "dataset-id", "fhir-store-id");
    // String resourceType = "Patient";

    // Instantiate the client, which will be used to interact with the service.
    HttpClient httpClient = HttpClients.createDefault();
    String uri = String.format("%s/v1/%s", API_ENDPOINT, resourceName);
    URIBuilder uriBuilder = new URIBuilder(uri).setParameter("access_token", getAccessToken());
    // To set additional parameters for search filtering, add them to the URIBuilder. For
    // example, to search for a Patient with the family name "Smith", specify the following:
    // uriBuilder.setParameter("family:exact", "Smith");

    HttpUriRequest request =
        RequestBuilder.get()
            .setUri(uriBuilder.build())
            .build();

    // Execute the request and process the results.
    HttpResponse response = httpClient.execute(request);
    HttpEntity responseEntity = response.getEntity();
    if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
      System.err.print(
          String.format(
              "Exception searching GET FHIR resources: %s\n", response.getStatusLine().toString()));
      responseEntity.writeTo(System.err);
      throw new RuntimeException();
    }
    System.out.println("FHIR resource GET search results: ");
    responseEntity.writeTo(System.out);
  }

  private static CloudHealthcare createClient() throws IOException {
    // Use Application Default Credentials (ADC) to authenticate the requests
    // For more information see https://cloud.google.com/docs/authentication/production
    GoogleCredentials credential =
        GoogleCredentials.getApplicationDefault()
            .createScoped(Collections.singleton(CloudHealthcareScopes.CLOUD_PLATFORM));
    // Create a HttpRequestInitializer, which will provide a baseline configuration to all requests.
    HttpRequestInitializer requestInitializer =
        request -> {
          new HttpCredentialsAdapter(credential).initialize(request);
          request.setConnectTimeout(60000); // 1 minute connect timeout
          request.setReadTimeout(60000); // 1 minute read timeout
        };
    // Build the client for interacting with the service.
    return new CloudHealthcare.Builder(HTTP_TRANSPORT, JSON_FACTORY, requestInitializer)
        .setApplicationName("your-application-name")
        .build();
  }

  private static String getAccessToken() throws IOException {
    GoogleCredentials credential =
        GoogleCredentials.getApplicationDefault()
            .createScoped(Collections.singleton(CloudHealthcareScopes.CLOUD_PLATFORM));

    return credential.refreshAccessToken().getTokenValue();
  }
}

Node.js

// Import google-auth-library for authentication.
const {GoogleAuth} = require('google-auth-library');

const searchFhirResourcesGet = async () => {
  const auth = new GoogleAuth({
    scopes: 'https://www.googleapis.com/auth/cloud-platform',
  });
  // TODO(developer): uncomment these lines before running the sample
  // const cloudRegion = 'us-central1';
  // const projectId = 'adjective-noun-123';
  // const datasetId = 'my-dataset';
  // const fhirStoreId = 'my-fhir-store';
  // const resourceType = 'Patient';
  const url = `https://healthcare.googleapis.com/v1/projects/${projectId}/locations/${cloudRegion}/datasets/${datasetId}/fhirStores/${fhirStoreId}/fhir/${resourceType}`;

  const params = {};
  // Specify search filters in a params object. For example, to filter on a
  // Patient with the last name "Smith", set resourceType to "Patient" and
  // specify the following params:
  // params = {'family:exact' : 'Smith'};
  const client = await auth.getClient();
  const response = await client.request({url, method: 'GET', params});
  const resources = response.data.entry;
  console.log(`Resources found: ${resources.length}`);
  console.log(JSON.stringify(resources, null, 2));
};

searchFhirResourcesGet();

Python

def search_resources_get(
    project_id,
    location,
    dataset_id,
    fhir_store_id,
    resource_type,
):
    """
    Uses the searchResources GET method to search for resources in the given FHIR store.

    See https://github.com/GoogleCloudPlatform/python-docs-samples/tree/main/healthcare/api-client/v1/fhir
    before running the sample."""
    # Imports Python's built-in "os" module
    import os

    # Imports the google.auth.transport.requests transport
    from google.auth.transport import requests

    # Imports a module to allow authentication using a service account
    from google.oauth2 import service_account

    # Gets credentials from the environment.
    credentials = service_account.Credentials.from_service_account_file(
        os.environ["GOOGLE_APPLICATION_CREDENTIALS"]
    )
    scoped_credentials = credentials.with_scopes(
        ["https://www.googleapis.com/auth/cloud-platform"]
    )
    # Creates a requests Session object with the credentials.
    session = requests.AuthorizedSession(scoped_credentials)

    # URL to the Cloud Healthcare API endpoint and version
    base_url = "https://healthcare.googleapis.com/v1"

    # TODO(developer): Uncomment these lines and replace with your values.
    # project_id = 'my-project'  # replace with your GCP project ID
    # location = 'us-central1'  # replace with the parent dataset's location
    # dataset_id = 'my-dataset'  # replace with the parent dataset's ID
    # fhir_store_id = 'my-fhir-store' # replace with the FHIR store ID
    # resource_type = 'Patient'  # replace with the FHIR resource type
    url = f"{base_url}/projects/{project_id}/locations/{location}"

    resource_path = "{}/datasets/{}/fhirStores/{}/fhir/{}".format(
        url, dataset_id, fhir_store_id, resource_type
    )

    response = session.get(resource_path)
    response.raise_for_status()

    resources = response.json()

    print(
        "Using GET request, found a total of {} {} resources:".format(
            resources["total"], resource_type
        )
    )
    print(json.dumps(resources, indent=2))

    return resources

Utiliser la méthode search avec POST

Les exemples suivants montrent comment rechercher des ressources dans un datastore FHIR donné à l'aide de la méthode projects.locations.datasets.fhirStores.fhir.search avec POST.

curl

Pour rechercher des ressources dans un datastore FHIR, envoyez une requête POST et spécifiez les informations suivantes :

  • Le nom de l'ensemble de données
  • Le nom du datastore FHIR
  • Le type de ressource à rechercher
  • Une chaîne de requête contenant les informations que vous recherchez, comme décrit dans la section Créer une requête de recherche
  • Un jeton d'accès

L'exemple suivant montre une requête POST utilisant curl pour rechercher tous les patients portant le nom de famille "Smith".

curl -X POST \
    --data "" \
    -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
    -H "Content-Type: application/fhir+json; charset=utf-8" \
    "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Patient/_search?family:exact=Smith"

Si la requête aboutit, le serveur renvoie la réponse en tant que Bundle FHIR au format JSON. Le Bundle.type est searchset et les résultats de recherche sont des entrées du tableau Bundle.entry. Dans cet exemple, la requête renvoie une seule ressource "Patient" incluant les données qu'elle contient :

{
  "entry": [
    {
      "fullUrl": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Patient/PATIENT_ID",
      "resource": {
        "birthDate": "1970-01-01",
        "gender": "female",
        "id": "PATIENT_ID",
        "meta": {
          "lastUpdated": "LAST_UPDATED",
          "versionId": "VERSION_ID"
        },
        "name": [
          {
            "family": "Smith",
            "given": [
              "Darcy"
            ],
            "use": "official"
          }
        ],
        "resourceType": "Patient"
      },
      "search": {
        "mode": "match"
      }
    }
  ],
  "link": [
    {
      "url": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Patient/?family%3Aexact=Smith"
    }
  ],
  "resourceType": "Bundle",
  "total": 1,
  "type": "searchset"
}

PowerShell

Pour rechercher des ressources dans un datastore FHIR, envoyez une requête POST et spécifiez les informations suivantes :

  • Le nom de l'ensemble de données
  • Le nom du datastore FHIR
  • Le type de ressource à rechercher
  • Une chaîne de requête contenant les informations que vous recherchez, comme décrit dans la section Créer une requête de recherche
  • Un jeton d'accès

L'exemple suivant montre une requête POST utilisant Windows PowerShell pour rechercher tous les patients portant le nom de famille "Smith".

$cred = gcloud auth application-default print-access-token
$headers = @{ Authorization = "Bearer $cred" }

Invoke-RestMethod `
  -Method Post `
  -Headers $headers `
  -ContentType: "application/fhir+json; charset=utf-8" `
  -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Patient/_search?family:exact=Smith" | ConvertTo-Json

Si la requête aboutit, le serveur renvoie la réponse en tant que Bundle FHIR au format JSON. Le Bundle.type est searchset et les résultats de recherche sont des entrées du tableau Bundle.entry. Dans cet exemple, la requête renvoie une seule ressource "Patient" incluant les données qu'elle contient :

{
  "entry": [
    {
      "fullUrl": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Patient/PATIENT_ID",
      "resource": {
        "birthDate": "1970-01-01",
        "gender": "female",
        "id": "PATIENT_ID",
        "meta": {
          "lastUpdated": "LAST_UPDATED",
          "versionId": "VERSION_ID"
        },
        "name": [
          {
            "family": "Smith",
            "given": [
              "Darcy"
            ],
            "use": "official"
          }
        ],
        "resourceType": "Patient"
      },
      "search": {
        "mode": "match"
      }
    }
  ],
  "link": [
    {
      "url": "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/Patient/?family%3Aexact=Smith"
    }
  ],
  "resourceType": "Bundle",
  "total": 1,
  "type": "searchset"
}

Java

import com.google.api.client.http.HttpRequestInitializer;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.services.healthcare.v1.CloudHealthcare;
import com.google.api.services.healthcare.v1.CloudHealthcareScopes;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.Collections;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.methods.RequestBuilder;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.HttpClients;

public class FhirResourceSearchPost {
  private static final String FHIR_NAME =
      "projects/%s/locations/%s/datasets/%s/fhirStores/%s/fhir/%s";
  // The endpoint URL for the Healthcare API. Required for HttpClient.
  private static final String API_ENDPOINT = "https://healthcare.googleapis.com";
  private static final JsonFactory JSON_FACTORY = new GsonFactory();
  private static final NetHttpTransport HTTP_TRANSPORT = new NetHttpTransport();

  public static void fhirResourceSearchPost(String resourceName)
      throws IOException, URISyntaxException {
    // String resourceName =
    //    String.format(
    //        FHIR_NAME, "project-id", "region-id", "dataset-id", "store-id", "resource-type");

    // Instantiate the client, which will be used to interact with the service.
    HttpClient httpClient = HttpClients.createDefault();
    String uri = String.format("%s/v1/%s/_search", API_ENDPOINT, resourceName);
    URIBuilder uriBuilder = new URIBuilder(uri).setParameter("access_token", getAccessToken());
    // To set additional parameters for search filtering, add them to the URIBuilder. For
    // example, to search for a Patient with the family name "Smith", specify the following:
    // uriBuilder.setParameter("family:exact", "Smith");

    // Set a body otherwise HttpClient complains there is no Content-Length set.
    StringEntity requestEntity = new StringEntity("");

    HttpUriRequest request =
        RequestBuilder.post()
            .setUri(uriBuilder.build())
            .setEntity(requestEntity)
            .addHeader("Content-Type", "application/fhir+json")
            .addHeader("Accept-Charset", "utf-8")
            .addHeader("Accept", "application/fhir+json; charset=utf-8")
            .build();

    // Execute the request and process the results.
    HttpResponse response = httpClient.execute(request);
    HttpEntity responseEntity = response.getEntity();
    if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
      System.err.print(
          String.format(
              "Exception searching POST FHIR resources: %s\n",
              response.getStatusLine().toString()));
      responseEntity.writeTo(System.err);
      throw new RuntimeException();
    }
    System.out.println("FHIR resource POST search results: ");
    responseEntity.writeTo(System.out);
  }

  private static CloudHealthcare createClient() throws IOException {
    // Use Application Default Credentials (ADC) to authenticate the requests
    // For more information see https://cloud.google.com/docs/authentication/production
    GoogleCredentials credential =
        GoogleCredentials.getApplicationDefault()
            .createScoped(Collections.singleton(CloudHealthcareScopes.CLOUD_PLATFORM));

    // Create a HttpRequestInitializer, which will provide a baseline configuration to all requests.
    HttpRequestInitializer requestInitializer =
        request -> {
          new HttpCredentialsAdapter(credential).initialize(request);
          request.setConnectTimeout(60000); // 1 minute connect timeout
          request.setReadTimeout(60000); // 1 minute read timeout
        };

    // Build the client for interacting with the service.
    return new CloudHealthcare.Builder(HTTP_TRANSPORT, JSON_FACTORY, requestInitializer)
        .setApplicationName("your-application-name")
        .build();
  }

  private static String getAccessToken() throws IOException {
    GoogleCredentials credential =
        GoogleCredentials.getApplicationDefault()
            .createScoped(Collections.singleton(CloudHealthcareScopes.CLOUD_PLATFORM));

    return credential.refreshAccessToken().getTokenValue();
  }
}

Node.js

// Import google-auth-library for authentication.
const {GoogleAuth} = require('google-auth-library');

const searchFhirResourcesPost = async () => {
  const auth = new GoogleAuth({
    scopes: 'https://www.googleapis.com/auth/cloud-platform',
    // Set application/fhir+json header because this is a POST request.
    headers: {'Content-Type': 'application/fhir+json'},
  });
  // TODO(developer): uncomment these lines before running the sample
  // const cloudRegion = 'us-central1';
  // const projectId = 'adjective-noun-123';
  // const datasetId = 'my-dataset';
  // const fhirStoreId = 'my-fhir-store';
  // const resourceType = 'Patient';
  const url = `https://healthcare.googleapis.com/v1/projects/${projectId}/locations/${cloudRegion}/datasets/${datasetId}/fhirStores/${fhirStoreId}/fhir/${resourceType}/_search`;

  const params = {};
  // Specify search filters in a params object. For example, to filter on a
  // Patient with the last name "Smith", set resourceType to "Patient" and
  // specify the following params:
  // params = {'family:exact' : 'Smith'};
  const client = await auth.getClient();
  const response = await client.request({url, method: 'POST', params});
  const resources = response.data.entry;
  console.log(`Resources found: ${resources.length}`);
  console.log(JSON.stringify(resources, null, 2));
};

searchFhirResourcesPost();

Python

def search_resources_post(project_id, location, dataset_id, fhir_store_id):
    """
    Searches for resources in the given FHIR store. Uses the
    _search POST method and a query string containing the
    information to search for. In this sample, the search criteria is
    'family:exact=Smith' on a Patient resource.

    See https://github.com/GoogleCloudPlatform/python-docs-samples/tree/main/healthcare/api-client/v1/fhir
    before running the sample."""
    # Imports Python's built-in "os" module
    import os

    # Imports the google.auth.transport.requests transport
    from google.auth.transport import requests

    # Imports a module to allow authentication using a service account
    from google.oauth2 import service_account

    # Gets credentials from the environment.
    credentials = service_account.Credentials.from_service_account_file(
        os.environ["GOOGLE_APPLICATION_CREDENTIALS"]
    )
    scoped_credentials = credentials.with_scopes(
        ["https://www.googleapis.com/auth/cloud-platform"]
    )
    # Creates a requests Session object with the credentials.
    session = requests.AuthorizedSession(scoped_credentials)

    # URL to the Cloud Healthcare API endpoint and version
    base_url = "https://healthcare.googleapis.com/v1"

    # TODO(developer): Uncomment these lines and replace with your values.
    # project_id = 'my-project'  # replace with your GCP project ID
    # location = 'us-central1'  # replace with the parent dataset's location
    # dataset_id = 'my-dataset'  # replace with the parent dataset's ID
    # fhir_store_id = 'my-fhir-store' # replace with the FHIR store ID
    url = f"{base_url}/projects/{project_id}/locations/{location}"

    fhir_store_path = "{}/datasets/{}/fhirStores/{}/fhir".format(
        url, dataset_id, fhir_store_id
    )

    resource_path = f"{fhir_store_path}/Patient/_search?family:exact=Smith"

    # Sets required application/fhir+json header on the request
    headers = {"Content-Type": "application/fhir+json;charset=utf-8"}

    response = session.post(resource_path, headers=headers)
    response.raise_for_status()

    resources = response.json()
    print(
        "Using POST request, found a total of {} Patient resources:".format(
            resources["total"]
        )
    )

    print(json.dumps(resources, indent=2))

    return resources

Créer une requête de recherche

La chaîne de requête est une série de paires name=value encodées sous forme d'URL. Une recherche combine toutes les paires à l'aide d'un AND logique. Chaque valeur peut être une liste de valeurs séparées par des virgules, qui sont traitées comme un OR logique de ces valeurs. Par exemple, Patient?key1=value1&key2=value2,value3 est une recherche sur des ressources Patient qui utilise les critères suivants :

(key1 = value1) AND (key2 = value2 OR key2 = value3)

Il n'existe pas de syntaxe permettant d'effectuer un OR de deux paires name=value.

Chaque type de ressource FHIR définit ses propres paramètres de recherche dans chaque version de FHIR. Les paramètres disponibles sont documentés dans la spécification FHIR de chaque ressource. Pour consulter un exemple, reportez-vous à la page Patient FHIR R4. Vous pouvez récupérer les paramètres de manière automatisée via la déclaration de capacités. L'API Cloud Healthcare accepte la plupart des paramètres de recherche. Vous pouvez trouver des exclusions via la déclaration de capacités ou la déclaration de conformité FHIR.

Pagination et tri

Le nombre de ressources renvoyées sur chaque page des résultats de recherche FHIR dépend des facteurs suivants :

  • Paramètre _count. Il contrôle le nombre maximal de ressources renvoyées par la méthode de recherche. Par exemple, _count=10 renvoie 10 ressources au maximum correspondant à la requête. La valeur par défaut est 100 et la valeur maximale autorisée est 1 000.
  • Taille des données de réponse. Une page de résultats de recherche peut en renvoyer moins que la valeur spécifiée dans le paramètre _count si la taille la réponse est volumineuse.

Si une recherche renvoie plus de ressources que le nombre de ressources correspondant à une la réponse inclut une URL de pagination dans le champ Bundle.link. Il y peut renvoyer plusieurs valeurs dans ce champ ; la valeur avec Bundle.link.relation = next indique que vous pouvez utiliser Bundle.link.url pour récupérer la page suivante.

La valeur de Bundle.total indique le nombre total de ressources correspondantes. Cette valeur est exacte si les résultats tiennent entièrement sur une page, mais elle devient une estimation approximative lorsque le nombre de résultats dépasse une page. Vous pouvez obtenir un total exact pour une recherche qui correspond à de nombreux résultats en suivant à plusieurs reprises des liens de pagination jusqu'à ce que les résultats soient épuisés.

Pour en savoir plus sur la pagination et les totaux de recherche, consultez la section Implémenter la pagination et les totaux de recherche avec la recherche FHIR.

Vous pouvez trier les résultats à l'aide du paramètre _sort, qui accepte une liste de noms de paramètres de recherche séparés par une virgule par ordre de priorité. Vous pouvez utiliser un préfixe - pour indiquer un ordre décroissant. Par exemple, la requête suivante trie les données par ordre croissant, départage les égalités par date décroissante et les égalités restantes par ordre de catégorie croissant :

_sort=status,-date,category

Délai d'indexation

Les ressources FHIR sont indexées de manière asynchrone, ce qui peut prendre un peu de temps entre le moment où une ressource est créée ou modifiée et le moment où la modification apparaît dans les résultats de recherche. La seule exception concerne les données d'identifiant de ressource, qui est indexé de manière synchrone en tant qu'index spécial. Par conséquent, la recherche à l'aide de l'identifiant de ressource n'est pas soumis à un délai d'indexation. Pour utiliser l'index synchrone spécial, le terme de recherche de l'identifiant doit suivre le format identifier=[system]|[value] ou identifier=[value], et vous pouvez utiliser l'un des paramètres de résultats de recherche suivants :

  • _count
  • _include
  • _revinclude
  • _summary
  • _elements

Si votre requête contient d'autres paramètres de recherche, la méthode standard asynchrone sera utilisé à la place. Notez que la recherche dans l'index spécial est optimisée pour résoudre un petit nombre de correspondances. La recherche n'est pas optimisée si vos critères de recherche d'identifiant correspondent à un grand nombre (plus de 2 000) de ressources. Pour une requête de recherche qui correspond à un grand nombre de ressources, vous pouvez éviter d'utiliser l'index synchrone spécial en incluant un paramètre _sort supplémentaire dans votre requête. Utilisez _sort=-_lastUpdated si vous souhaitez conserver l'ordre de tri par défaut.

Rechercher dans tous les types de ressources

Certains paramètres de recherche, signalés par un trait de soulignement tel que _id, s'appliquent à tous les types de ressources. Ces paramètres "toutes les ressources" sont répertoriés dans la spécification FHIR pour le type de ressource.

Lorsque vous utilisez ces paramètres de recherche, vous pouvez effectuer une recherche sur plusieurs types de ressources en omettant le type de ressource dans le chemin de la requête. Par exemple, l'utilisation de GET .../fhir?_id=1234 au lieu de GET .../fhir/Patient?_id=1234 recherche toutes les ressources FHIR au lieu d'une ressource Patient seulement. Vous pouvez utiliser le paramètre spécial _type avec ce type de requête pour limiter les résultats à une liste de types de ressources séparés par une virgule. Par exemple, la requête suivante ne renvoie que les résultats correspondants pour les ressources Observation et Condition :

GET .../fhir?_tag=active&_type=Observation,Condition

Types de données

Chaque paramètre de recherche défini par FHIR possède un type de données, qui inclut des types primitifs tels que les suivants :

  • Chaîne
  • Nombre
  • Date

Les types de données incluent également les types complexes suivants :

  • Jeton
  • Référence
  • Quantité

Chaque type de données possède sa propre syntaxe pour spécifier des valeurs. Chaque type de données est compatible avec des modificateurs qui modifient la façon dont la recherche est effectuée.

Les sections suivantes montrent comment utiliser les types de données. Pour en savoir plus sur les autres types de données, les syntaxes de valeur et les modificateurs, consultez la page Fonctionnalités de recherche FHIR avancées.

Nombre

Effectue une recherche sur des valeurs entières ou à virgule flottante. Pour modifier le comparateur, ajoutez la valeur à l'un des modificateurs suivants en tant que préfixe :

  • ne
  • lt
  • le
  • gt
  • ge

Par exemple, utilisez [parameter]=100 pour égal à 100, ou [parameter]=ge100 pour supérieur ou égal à 100.

Date

Effectue une recherche sur n'importe quel type de date, d'heure ou de période. Le format du paramètre de date est le suivant :

yyyy-mm-ddThh:mm:ss[Z|(+|-)hh:mm]

Les mêmes modificateurs de préfixe que ceux qui sont utilisés pour le nombre s'appliquent.

Chaîne

Utilise par défaut une recherche de préfixe non sensible à la casse, aux accents ou aux autres signes diacritiques.

Jeton

Recherche une correspondance de chaîne exacte d'un "code". Vous pouvez étendre la recherche à l'URI d'un "système" indiquant que la valeur de code définie est issue du format suivant :

[parameter]=[system]|[code]

Par exemple, la recherche suivante correspond à un code de valeur 10738-3, mais seulement lorsqu'il est considéré comme une valeur d'un système de codage avec l'URI spécifié :

code=http://hl7.org/fhir/ValueSet/observation-codes|10738-3

Quantité

Recherche une valeur numérique à l'aide des mêmes modificateurs de préfixe qu'un nombre. Vous pouvez qualifier la recherche avec un système et un code spécifiques indiquant les unités de la valeur au format suivant :

[parameter]=[prefix][number]|[system]|[code]

Par exemple, la requête suivante recherche des valeurs de quantité inférieures à 9,1 avec le système d'unités et le code spécifiés :

value-quantity=lt9.1|http://unitsofmeasure.org|mg

Référence

Recherche les références entre les ressources. Vous pouvez utiliser les requêtes suivantes pour les références aux ressources d'un magasin FHIR :

  • [parameter]=[id]
  • [parameter]=[type]/[id]

Vous pouvez utiliser [parameter]=[url] pour spécifier des références par URL pouvant se trouver en dehors du magasin FHIR.

Gestion des paramètres de recherche

Par défaut, la méthode de recherche applique un traitement "indulgent" qui ignore les paramètres que la recherche ne reconnaît pas. La méthode de recherche effectue la recherche en utilisant les paramètres restants dans la requête, ce qui peut renvoyer plus de ressources que prévu.

La réponse comprend les éléments suivants :

  • Une valeur dans Bundle.link avec une valeur de Bundle.link.relation = self.
  • Le paramètre Bundle.link.url d'une URL ne contenant que les paramètres qui ont été appliqués à la recherche avec succès. Vous pouvez inspecter cette valeur pour déterminer si des paramètres ont été ignorés.

Vous pouvez définir l'en-tête HTTP de la requête sur Prefer: handling=strict dans le cadre d'une requête de recherche. La définition de l'en-tête force le magasin FHIR à renvoyer une erreur sur tout paramètre non reconnu.