Buscar recursos de FHIR

En esta página, se explican las instrucciones básicas para buscar recursos de FHIR en un almacén de FHIR. La búsqueda de recursos de FHIR es la principal forma de consultar y obtener estadísticas a partir de los datos de FHIR.

Puedes buscar recursos de FHIR en la API de Cloud Healthcare de las siguientes maneras:

En esta página, se resumen muchas de las funciones de búsqueda de uso común, pero no se enumeran de forma exhaustiva las partes de la especificación de búsqueda FHIR compatibles con la API de Cloud Healthcare.

Usa el visualizador de FHIR

El visualizador de FHIR es una página en la consola de Google Cloud que te permite buscar y ver el contenido de los recursos de FHIR.

Para buscar recursos en un almacén de FHIR, completa los siguientes pasos:

  1. En la consola de Google Cloud , ve a la página Visor de FHIR.

    Ir al Visor de FHIR

  2. En la lista desplegable Almacén de FHIR, selecciona un conjunto de datos y, luego, un almacén de FHIR en el conjunto de datos.

  3. Para filtrar la lista de tipos de recursos, busca los tipos de recursos que deseas mostrar:

    1. Haz clic en el campo Tipo de recurso.

    2. En la lista desplegable Propiedades que aparece, selecciona Tipo de recurso.

    3. Ingresa un tipo de recurso.

    4. Para buscar otro tipo de recurso, selecciona O en la lista desplegable Operadores que aparece y, luego, ingresa otro tipo de recurso.

  4. En la lista de tipos de recursos, selecciona el tipo de recurso en el que deseas realizar la búsqueda.

  5. En el cuadro de búsqueda de la tabla de recursos que aparece, ingresa el valor que deseas buscar.

El visualizador de FHIR muestra los resultados de la búsqueda en una tabla. Después de seleccionar un recurso, el visualizador de FHIR muestra su contenido.

Cuando ves el contenido de un recurso, puedes buscar datos dentro de él.

Para buscar datos dentro de un recurso, sigue estos pasos:

  1. Selecciona un recurso

  2. En el panel Visor de FHIR, haz clic en la pestaña Elementos.

  3. En el cuadro de búsqueda, ingresa el valor que deseas buscar.

Descarga de datos binarios en recursos de FHIR

Para descargar los datos binarios disponibles asociados a un recurso en el visor de FHIR, sigue estos pasos:

  1. Selecciona un recurso.

  2. En el panel Visor de FHIR, haz clic en la pestaña Elementos.

  3. Si es necesario, expande los elementos para acceder al elemento de recurso requerido.

  4. Haz clic en Descargar archivo para descargar los datos disponibles.

Cómo crear y ejecutar búsquedas avanzadas

Puedes usar consultas de búsquedas avanzadas para buscar recursos de FHIR específicos mediante la especificación de búsqueda de FHIR.

Para crear una búsqueda avanzada, completa los siguientes pasos:

  1. En la página Visor de FHIR, haz clic en la pestaña Buscar.

  2. Para crear una búsqueda, haz clic en Abrir el compilador de consultas.

    Se mostrará el panel Selección de consultas.

  3. En la lista Selecciona un tipo de recurso de FHIR, elige el tipo de recurso de FHIR que deseas buscar.

  4. Haz clic en Continuar.

  5. En la lista Parámetro, selecciona el parámetro que deseas usar para buscar recursos.

  6. En la lista Modificador, selecciona el modificador que se aplicará a la búsqueda. La lista solo incluye modificadores compatibles con el tipo de datos del parámetro seleccionado.

    Esta es una selección opcional. Si no se selecciona ningún modificador, se realiza una verificación de igualdad.

  7. En el campo Valor, ingresa el valor del parámetro de consulta.

  8. Para agregar más de un valor de parámetro, haz clic en O. Esto te permite incluir varios valores de tu parámetro de recursos en tu búsqueda.

    A medida que creas tu búsqueda, esta se muestra en el panel Vista previa de la consulta. Para ver la URL completa de la búsqueda, haz clic en Mostrar ruta completa.

  9. Para agregar más de un parámetro, haz clic en Y.

  10. Haz clic en Continuar.

  11. Para incluir los recursos a los que hacen referencia los recursos que se muestran en tu búsqueda, elige el parámetro de recurso en la lista desplegable Parámetros incluidos.

  12. Para incluir recursos que hagan referencia a los recursos que se muestran en tu búsqueda, elige el parámetro de recurso en la lista desplegable Parámetros incluidos inversos.

  13. Haz clic en Listo para guardar la búsqueda.

    La consulta de búsqueda guardada se muestra en el campo Operación de búsqueda de FHIR.

  14. Para buscar recursos con la consulta, haz clic en Ejecutar búsqueda.

    Los resultados de la búsqueda se muestran en la lista Resultados de la búsqueda. Para ver los detalles de un recurso que se muestra en la búsqueda, haz clic en un recurso de la lista.

  15. Para guardar la consulta como plantilla, haz clic en Guardar plantilla y elige Guardar plantilla o Guardar plantilla como. Se te pedirá que ingreses un nombre y una descripción para la consulta. Los parámetros de consulta se guardan en una plantilla, pero se quitan los valores definidos.

Ejemplo de búsqueda

En el siguiente ejemplo, se muestra una búsqueda que busca recursos Claim de un proveedor de atención médica específico, Practitioner/12345, para el mes de agosto de 2021:

  • Parámetro: care-team
    • Value: Practitioner/12345
  • Operador: Y
  • Parámetro: created
    • Prefijo: lt (lesser than)
    • Value: 8/1/21, 12:00 AM
  • Operador: Y
  • Parámetro: created
    • Prefijo: gt (greater than)
    • Value: 8/31/21, 11:59 PM

Esto se configura de la siguiente manera en el panel Selección de consulta, y la consulta se muestra en el panel Vista previa de consulta. La consulta se mostrará en el campo Operación de búsqueda de FHIR.

Consulta de búsqueda avanzada de FHIR

Cómo editar búsquedas

Para editar una búsqueda, realiza una de las siguientes acciones:

  • Para editar la consulta en el compilador de consultas, haz clic en Abrir el compilador de consultas.
  • Para editar la consulta de forma manual, edita los valores de los parámetros en el cuadro de texto.

Cómo ejecutar plantillas de consulta

Para ejecutar una consulta desde una plantilla guardada, completa los siguientes pasos:

  1. Haz clic en Plantillas guardadas.

    Se muestra la pestaña Plantillas de búsqueda del panel Selección de consultas, en la que se muestran todas las plantillas de consultas guardadas.

  2. Selecciona la plantilla de consulta que deseas ejecutar y haz clic en Listo.

    La búsqueda de la plantilla se muestra en el campo Operación de búsqueda de FHIR sin ningún valor.

  3. Para definir los valores de tu búsqueda, edita los valores de los parámetros en el campo.

  4. Haz clic en Ejecutar búsqueda para buscar recursos con la consulta.

Comparte recursos de FHIR

Puedes compartir un vínculo a las versiones actuales o históricas de un recurso de FHIR.

Console

  1. En la consola de Google Cloud , ve a la página Visor de FHIR.

    Ir al Visor de FHIR

  2. En el menú Almacén de FHIR, selecciona un conjunto de datos y, luego, un almacén de FHIR en el conjunto de datos.

  3. Para filtrar la lista de tipos de recursos de FHIR, busca los tipos de recursos que deseas mostrar.

  4. Haz clic en el campo Tipo de recurso.

  5. En la lista desplegable Propiedades que aparece, selecciona Tipo de recurso.

  6. Ingresa un tipo de recurso de FHIR.

  7. En la lista de tipos de recursos de FHIR, selecciona un tipo de recurso.

  8. En la tabla de recursos de FHIR que aparece, selecciona o busca un recurso.

  9. En el panel del Visor de FHIR, haz clic en Compartir. Se copiará automáticamente en el portapapeles un vínculo para compartir el recurso FHIR.

Usa el método search

Para buscar recursos de FHIR con la API de REST, usa el método projects.locations.datasets.fhirStores.fhir.search. Puedes llamar al método con solicitudes GET o POST.

Usa el método search con GET

En los siguientes ejemplos, se muestra cómo buscar recursos en una tienda de FHIR determinada mediante el método projects.locations.datasets.fhirStores.fhir.search con GET.

curl

Para buscar recursos en una tienda de FHIR, realiza una solicitud GET y especifica la siguiente información:

  • El nombre del conjunto de datos
  • El nombre de la tienda de FHIR
  • El tipo de recurso que deseas buscar
  • Una string de consulta que contiene la información que buscas, como se describe en la sección Cómo construir una búsqueda
  • Un token de acceso

En el siguiente ejemplo, se muestra una solicitud GET mediante curl para buscar todos los pacientes con el apellido "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 solicitud es exitosa, el servidor mostrará la respuesta como un Bundle de FHIR en formato JSON. Bundle.type es searchset y los resultados de la búsqueda son entradas en el arreglo Bundle.entry. En este ejemplo, la solicitud muestra un solo recurso Patient que incluye los datos dentro de ese recurso:

{
  "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

Para buscar recursos en una tienda de FHIR, realiza una solicitud GET y especifica la siguiente información:

  • El nombre del conjunto de datos
  • El nombre de la tienda de FHIR
  • El tipo de recurso que deseas buscar
  • Una string de consulta que contiene la información que buscas, como se describe en la sección Cómo construir una búsqueda
  • Un token de acceso

En el siguiente ejemplo, se muestra una solicitud GET mediante Windows PowerShell para buscar todos los pacientes con el apellido "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 solicitud es exitosa, el servidor mostrará la respuesta como un Bundle de FHIR en formato JSON. Bundle.type es searchset y los resultados de la búsqueda son entradas en el arreglo Bundle.entry. En este ejemplo, la solicitud muestra un solo recurso Patient que incluye los datos dentro de ese recurso:

{
  "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

Usa el método search con POST

En los siguientes ejemplos, se muestra cómo buscar recursos en una tienda de FHIR determinada mediante el método projects.locations.datasets.fhirStores.fhir.search con POST.

curl

Para buscar recursos en una tienda de FHIR, realiza una solicitud POST y especifica la siguiente información:

  • El nombre del conjunto de datos
  • El nombre de la tienda de FHIR
  • El tipo de recurso que deseas buscar
  • Una string de consulta que contiene la información que buscas, como se describe en la sección Cómo construir una búsqueda
  • Un token de acceso

En el siguiente ejemplo, se muestra una solicitud POST mediante curl para buscar todos los pacientes con el apellido "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 solicitud es exitosa, el servidor mostrará la respuesta como un Bundle de FHIR en formato JSON. Bundle.type es searchset y los resultados de la búsqueda son entradas en el arreglo Bundle.entry. En este ejemplo, la solicitud muestra un solo recurso Patient que incluye los datos dentro de ese recurso:

{
  "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

Para buscar recursos en una tienda de FHIR, realiza una solicitud POST y especifica la siguiente información:

  • El nombre del conjunto de datos
  • El nombre de la tienda de FHIR
  • El tipo de recurso que deseas buscar
  • Una string de consulta que contiene la información que buscas, como se describe en la sección Cómo construir una búsqueda
  • Un token de acceso

En el siguiente ejemplo, se muestra una solicitud POST mediante Windows PowerShell para buscar todos los pacientes con el apellido "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 solicitud es exitosa, el servidor mostrará la respuesta como un Bundle de FHIR en formato JSON. Bundle.type es searchset y los resultados de la búsqueda son entradas en el arreglo Bundle.entry. En este ejemplo, la solicitud muestra un solo recurso Patient que incluye los datos dentro de ese recurso:

{
  "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

Cómo crear una búsqueda

La cadena de consulta es una serie de pares name=value codificados con el formato de una URL. Una búsqueda combina todos los pares con un AND lógico. Cada valor puede ser una lista de valores separados por comas, que se tratan como un OR lógico de esos valores. Por ejemplo, Patient?key1=value1&key2=value2,value3 es una búsqueda en los recursos de Patient con los siguientes criterios:

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

No hay una sintaxis para realizar un OR de dos pares name=value.

Cada tipo de recurso de FHIR define sus propios parámetros de búsqueda en cada versión de FHIR. Los parámetros disponibles se documentan en la especificación de FHIR de cada recurso. Para ver un ejemplo, consulta Paciente de FHIR R4. Puedes recuperar los parámetros de forma programática a través de la declaración de capacidad. La API de Cloud Healthcare admite la mayoría de los parámetros de búsqueda. Las exclusiones se pueden encontrar a través de la declaración de capacidad o de la declaración de conformidad de FHIR.

Paginación y ordenamiento

La cantidad de recursos que se muestran en cada página de los resultados de la búsqueda de FHIR depende de los siguientes factores:

  • Es el parámetro _count. Controla la cantidad máxima de recursos que se devuelven del método de búsqueda. Por ejemplo, _count=10 muestra como máximo 10 recursos que coinciden con la búsqueda. El valor predeterminado es 100 y el valor máximo permitido es 1,000.
  • Es el tamaño de los datos de la respuesta. Una página de resultados de la búsqueda puede devolver menos recursos que el valor especificado en el parámetro _count si el tamaño de la respuesta es grande.

Si una búsqueda devuelve más recursos de los que caben en una página, la respuesta incluye una URL de paginación en el campo Bundle.link. Es posible que se muestren varios valores en este campo. El valor en el que Bundle.link.relation = next indica que se puede usar la Bundle.link.url correspondiente para recuperar la siguiente página.

El valor de Bundle.total indica la cantidad total de recursos coincidentes. Este valor es exacto si los resultados caben todos en una página, pero se convierte en una estimación aproximada a medida que la cantidad de resultados ocupa más de una página. Puedes obtener un total exacto para una búsqueda que coincide con muchos resultados si sigues los vínculos de paginación hasta que se agoten los resultados.

Para obtener más información sobre la paginación y los totales de búsqueda, consulta Implementa la paginación y los totales de búsqueda con la búsqueda de FHIR.

Puedes ordenar los resultados con el parámetro _sort, que acepta una lista separada por comas de nombres de parámetros de búsqueda en orden de prioridad. Puedes usar un prefijo - para indicar el orden descendente. Por ejemplo, la siguiente consulta ordena por estado de forma ascendente, divide los vínculos por fecha de forma descendente y cualquier vínculo restante por categoría de forma ascendente:

_sort=status,-date,category

_sort solo se admite para los parámetros de búsqueda de tipo number, data, string, token y quantity. Para ordenar los resultados con otros tipos de parámetros de búsqueda (por ejemplo, reference), usa las búsquedas personalizadas de FHIR para crear, por ejemplo, un parámetro de búsqueda string en el campo reference.

Demora en la indexación

Los recursos de FHIR se indexan de forma asíncrona, por lo que puede haber una pequeña demora entre el momento en que se crea o se cambia un recurso y el momento en que el cambio se refleja en los resultados de la búsqueda. La única excepción son los datos del identificador de recursos, que se indexan de forma síncrona como un índice especial. Como resultado, la búsqueda con el identificador de recursos no está sujeta a demoras en la indexación. Para usar el índice especial síncrono, el término de búsqueda del identificador debe seguir el patrón identifier=[system]|[value] o identifier=[value], y se puede usar cualquiera de los siguientes parámetros de resultado de la búsqueda:

  • _count
  • _include
  • _revinclude
  • _summary
  • _elements

Si tu búsqueda contiene otros parámetros de búsqueda, se usará el índice asíncrono estándar. Ten en cuenta que la búsqueda en el índice especial está optimizada para resolver una pequeña cantidad de coincidencias. La búsqueda no se optimiza si tus criterios de búsqueda de identificadores coinciden con una gran cantidad (es decir, más de 2,000) de recursos. Para una búsqueda que coincida con una gran cantidad de recursos, puedes evitar el uso del índice síncrono especial si incluyes un parámetro _sort adicional en tu búsqueda. Usa _sort=-_lastUpdated si deseas conservar el orden de clasificación predeterminado.

Busca en todos los tipos de recursos

Ciertos parámetros de búsqueda, que se distinguen porque comienzan con un guión bajo como _id, se aplican a todos los tipos de recursos. Estos parámetros para todos los recursos se enumeran en la especificación de FHIR destinada al tipo de recurso.

Cuando usas estos parámetros de búsqueda, puedes realizar una búsqueda en varios tipos de recursos si omites el tipo de recurso en la ruta de la solicitud. Por ejemplo, si usas GET .../fhir?_id=1234 en lugar de GET .../fhir/Patient?_id=1234, se busca en todos los recursos de FHIR en lugar de solo en un recurso de Patient. Puedes usar el parámetro especial _type con este tipo de solicitud para limitar los resultados a una lista de tipos de recursos separados por comas. Por ejemplo, la siguiente consulta solo muestra los resultados coincidentes para los recursos Observation y Condition:

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

Tipos de datos

Cada parámetro de búsqueda definido por FHIR tiene un tipo de datos, que incluye tipos primitivos, como los siguientes:

  • String
  • Número
  • Fecha

Los tipos de datos también incluyen los siguientes tipos complejos:

  • Token
  • Referencia
  • Cantidad

Cada tipo de datos tiene su propia sintaxis para especificar valores. Cada tipo de datos admite modificadores que alteran la forma en que se realiza la búsqueda.

En las siguientes secciones, se muestra cómo usar los tipos de datos. Para obtener más detalles sobre los tipos de datos adicionales, las sintaxis de valores y los modificadores, consulta Funciones de búsqueda avanzada de FHIR.

Número

Busca en valores de números enteros o de punto flotante. Para cambiar el comparador, antepón al valor uno de los siguientes modificadores:

  • ne
  • lt
  • le
  • gt
  • ge

Por ejemplo, usa [parameter]=100 para igualdad o [parameter]=ge100 para mayor o igual que 100.

Fecha

Busca en cualquier tipo de fecha, hora o período. El formato del parámetro de fecha es el siguiente:

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

Se aplican los mismos modificadores de prefijo que se usan para número.

String

Se establece de forma predeterminada como una búsqueda de prefijo que no es sensible al uso de mayúsculas y minúsculas, a los acentos o a otros signos diacríticos.

Token

Busca una coincidencia de cadena exacta de un "código". Puedes limitar el alcance de la búsqueda al URI de un "sistema" que indica el conjunto de valores del cual se toma el código con el siguiente formato:

[parameter]=[system]|[code]

Por ejemplo, la siguiente búsqueda coincide con un código de 10738-3, pero solo cuando se califica como un valor de un sistema de codificación que contiene el URI especificado:

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

Cantidad

Busca un valor numérico mediante los mismos modificadores de prefijo que número. Puedes calificar la búsqueda con un sistema y un código específicos que indiquen las unidades del valor en el siguiente formato:

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

Por ejemplo, la siguiente búsqueda busca valores de cantidad inferiores a 9.1 que tengan el código y el sistema de unidades especificados:

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

Referencia

Busca referencias entre recursos. Puedes usar las siguientes consultas para hacer referencia a recursos dentro de un almacén de FHIR:

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

Puedes usar [parameter]=[url] para especificar referencias por URL que podrían estar fuera del almacén de FHIR.

Busca en la organización de parámetros

De forma predeterminada, el método de búsqueda aplica la organización "indulgente", que ignora los parámetros que no reconoce la búsqueda. El método de búsqueda realiza la búsqueda con los parámetros restantes de la solicitud, lo que podría mostrar más recursos de los esperados.

La respuesta incluye lo siguiente:

  • Un valor en Bundle.link con un valor de Bundle.link.relation = self
  • Es un Bundle.link.url de una URL que contiene solo los parámetros que se aplicaron correctamente a la búsqueda. Puedes inspeccionar este valor para determinar si se ignoró algún parámetro.

Puedes configurar el encabezado HTTP de la solicitud en Prefer: handling=strict en una solicitud de búsqueda. Si se configura el encabezado, se hará que el almacén de FHIR muestre un error en cualquier parámetro no reconocido.