Como pesquisar recursos FHIR

Nesta página, mostramos as instruções básicas para pesquisar recursos de FHIR em um armazenamento FHIR. Pesquisar por recursos de FHIR é a principal maneira de consultar e conseguir insights de dados de FHIR.

É possível pesquisar recursos de FHIR na API Cloud Healthcare das seguintes maneiras:

Esta página resume muitos dos recursos de pesquisa mais usados, mas não é uma lista completa dos componentes da especificação de pesquisa de FHIR suportados pela API Cloud Healthcare.

Como usar o visualizador de FHIR

O visualizador FHIR é uma página no console do Google Cloud que permite pesquisar e visualizar o conteúdo de recursos FHIR.

Para pesquisar recursos em um armazenamento FHIR, siga estas etapas:

  1. No console do Google Cloud, acesse a página do visualizador de FHIR.

    Acessar o visualizador do FHIR

  2. Na lista suspensa Armazenamento de FHIR, selecione um conjunto de dados e, em seguida, selecione um armazenamento de FHIR no conjunto de dados.

  3. Para filtrar a lista de tipos de recursos, pesquise os que você quer exibir:

    1. Clique no campo Resource Type.

    2. Na lista suspensa Propriedades, selecione Tipo de recurso.

    3. Insira um tipo de recurso.

    4. Para procurar outro tipo de recurso, selecione OU na lista suspensa Operadores exibida e insira outro tipo de recurso.

  4. Na lista de tipos de recursos, selecione o tipo de recurso em que você quer pesquisar.

  5. Na caixa de pesquisa da tabela de recursos exibida, digite o valor que você quer pesquisar.

O visualizador de FHIR exibe os resultados da pesquisa em uma tabela. Depois de selecionar um recurso, o visualizador de FHIR exibe o conteúdo do recurso.

Quando você visualiza o conteúdo de um recurso, é possível pesquisar dados dentro dele.

Para pesquisar dados em um recurso, siga estas etapas:

  1. Selecione um recurso.

  2. No painel Visualizador de FHIR, clique na guia Elementos.

  3. Na caixa de pesquisa, digite o valor que você quer pesquisar.

Como fazer o download de dados binários nos recursos FHIR

Para fazer o download dos dados binários disponíveis associados a um recurso no visualizador de FHIR, siga estas etapas:

  1. Selecione um recurso.

  2. No painel Visualizador de FHIR, clique na guia Elementos.

  3. Se necessário, expanda os elementos para acessar o elemento de recurso necessário.

  4. Clique em Fazer o download do arquivo para fazer o download dos dados disponíveis.

Criação e execução de consultas de pesquisa avançada

É possível usar consultas de pesquisa avançadas para procurar recursos específicos de FHIR usando a especificação de pesquisa FHIR.

Para criar uma consulta de pesquisa avançada, siga estas etapas:

  1. Na página Visualizador de FHIR, clique na guia Pesquisa.

  2. Para criar uma consulta de pesquisa, clique em Abrir o criador de consultas.

    O painel Seleção de consulta é exibido.

  3. Na lista Selecionar um tipo de recurso FHIR, escolha o tipo de recurso FHIR que você quer pesquisar.

  4. Clique em Continuar.

  5. Na lista Parâmetro, selecione o parâmetro que você quer usar para pesquisar recursos.

  6. Na lista Modifier, selecione o modificador a ser aplicado à consulta. A lista inclui apenas modificadores compatíveis com o tipo de dados do parâmetro selecionado.

    Essa seleção é opcional. Se nenhum modificador for selecionado, uma verificação de igualdade será realizada.

  7. No campo Valor, insira o valor do parâmetro de consulta.

  8. Para adicionar mais de um valor de parâmetro, clique em OU. Assim, é possível incluir vários valores do parâmetro de recurso na consulta de pesquisa.

    À medida que você cria sua consulta de pesquisa, ela é exibida no painel Visualização da consulta. Para ver o URL completo da consulta de pesquisa, clique em Mostrar caminho completo.

  9. Para adicionar mais de um parâmetro, clique em E.

  10. Clique em Continuar.

  11. Para incluir recursos referenciados pelos recursos retornados na consulta de pesquisa, escolha o parâmetro de recurso na lista suspensa Parâmetros incluídos.

  12. Para incluir recursos que fazem referência aos recursos retornados na consulta de pesquisa, escolha o parâmetro do recurso na lista suspensa Reverter parâmetros incluídos.

  13. Clique em Concluído para salvar a consulta de pesquisa.

    A consulta de pesquisa salva é exibida no campo Operação de pesquisa FHIR.

  14. Para pesquisar recursos com a consulta, clique em Executar pesquisa.

    Os resultados da pesquisa são exibidos na lista Resultados da pesquisa. Para ver detalhes de um recurso retornado pela pesquisa, clique em um recurso na lista.

  15. Para salvar a consulta como um modelo, clique em Salvar modelo e escolha Salvar modelo ou Salvar modelo como. Você precisará inserir um nome e uma descrição para a consulta. Os parâmetros de consulta são salvos em um modelo, mas todos os valores definidos são removidos.

Exemplo de consulta de pesquisa

O exemplo a seguir mostra uma consulta de pesquisa que procura recursos de reivindicação de um provedor de saúde específico, Practitioner/12345, para o mês de agosto de 2021:

  • Parâmetro: care-team
    • Valor: Practitioner/12345
  • Operador: AND
  • Parâmetro: created
    • Prefixo: lt (lesser than)
    • Valor: 8/1/21, 12:00 AM
  • Operador: AND
  • Parâmetro: created
    • Prefixo: gt (greater than)
    • Valor: 8/31/21, 11:59 PM

Isso é configurado da seguinte maneira no painel Seleção de consulta, e a consulta é visualizada no painel Visualização da consulta. A consulta será exibida no campo Operação de pesquisa FHIR.

Consulta de pesquisa avançada FHIR

Como editar consultas de pesquisa

Para editar uma consulta de pesquisa, siga um destes procedimentos:

  • Para editar a consulta no criador de consultas, clique em Abrir o criador de consultas.
  • Para editar manualmente a consulta, edite os valores dos parâmetros na caixa de texto.

Como executar modelos de consulta

Para executar uma consulta a partir de um modelo salvo, siga estas etapas:

  1. Clique em Modelos salvos.

    A guia Modelos de pesquisa do painel Seleção de consulta é exibida, mostrando todos os modelos de consulta salvos.

  2. Selecione o modelo de consulta que você quer executar e clique em Concluído.

    A consulta de pesquisa do modelo é exibida sem valores no campo Operação de pesquisa de FHIR.

  3. Para definir os valores da sua consulta de pesquisa, edite os valores dos parâmetros no campo.

  4. Clique em Executar pesquisa para procurar recursos com a consulta.

Como usar o método search

Para pesquisar recursos de FHIR com a API REST, use o método projects.locations.datasets.fhirStores.fhir.search. Chame o método usando solicitações GET ou POST.

Como usar o método search com GET

Os exemplos a seguir mostram como pesquisar recursos em um determinado armazenamento FHIR usando o método projects.locations.datasets.fhirStores.fhir.search com GET.

curl

Para pesquisar recursos em um armazenamento FHIR, faça uma solicitação GET e especifique as seguintes informações:

  • O nome do conjunto de dados
  • O nome do armazenamento FHIR
  • O tipo de recurso a ser pesquisado
  • Uma string de consulta contendo as informações que você está pesquisando, conforme descrito na seção Como criar uma consulta de pesquisa
  • Um token de acesso

O exemplo a seguir mostra uma solicitação GET usando curl para pesquisar todos os pacientes com o sobrenome "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"

Se a solicitação for bem-sucedida, o servidor retornará a resposta como um Bundle do FHIR no formato JSON. O Bundle.type é searchset, e os resultados da pesquisa são entradas na matriz Bundle.entry. Neste exemplo, a solicitação retorna um único recurso Paciente, incluindo os dados dentro do 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 pesquisar recursos em um armazenamento FHIR, faça uma solicitação GET e especifique as seguintes informações:

  • O nome do conjunto de dados
  • O nome do armazenamento FHIR
  • O tipo de recurso a ser pesquisado
  • Uma string de consulta contendo as informações que você está pesquisando, conforme descrito na seção Como criar uma consulta de pesquisa
  • Um token de acesso

O exemplo a seguir mostra uma solicitação GET usando o Windows PowerShell para pesquisar todos os pacientes com o sobrenome "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

Se a solicitação for bem-sucedida, o servidor retornará a resposta como um Bundle do FHIR no formato JSON. O Bundle.type é searchset, e os resultados da pesquisa são entradas na matriz Bundle.entry. Neste exemplo, a solicitação retorna um único recurso Paciente, incluindo os dados dentro do 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

Como usar o método search com POST

Os exemplos a seguir mostram como pesquisar recursos em um determinado armazenamento FHIR usando o método projects.locations.datasets.fhirStores.fhir.search com POST.

curl

Para pesquisar recursos em um armazenamento FHIR, faça uma solicitação POST e especifique as seguintes informações:

  • O nome do conjunto de dados
  • O nome do armazenamento FHIR
  • O tipo de recurso a ser pesquisado
  • Uma string de consulta contendo as informações que você está pesquisando, conforme descrito na seção Como criar uma consulta de pesquisa
  • Um token de acesso

O exemplo a seguir mostra uma solicitação POST usando curl para pesquisar todos os pacientes com o sobrenome "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"

Se a solicitação for bem-sucedida, o servidor retornará a resposta como um Bundle do FHIR no formato JSON. O Bundle.type é searchset, e os resultados da pesquisa são entradas na matriz Bundle.entry. Neste exemplo, a solicitação retorna um único recurso Paciente, incluindo os dados dentro do 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 pesquisar recursos em um armazenamento FHIR, faça uma solicitação POST e especifique as seguintes informações:

  • O nome do conjunto de dados
  • O nome do armazenamento FHIR
  • O tipo de recurso a ser pesquisado
  • Uma string de consulta contendo as informações que você está pesquisando, conforme descrito na seção Como criar uma consulta de pesquisa
  • Um token de acesso

O exemplo a seguir mostra uma solicitação POST usando o Windows PowerShell para pesquisar todos os pacientes com o sobrenome "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

Se a solicitação for bem-sucedida, o servidor retornará a resposta como um Bundle do FHIR no formato JSON. O Bundle.type é searchset, e os resultados da pesquisa são entradas na matriz Bundle.entry. Neste exemplo, a solicitação retorna um único recurso Paciente, incluindo os dados dentro do 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

Como criar uma consulta de pesquisa

A string de consulta é uma série de pares name=value codificados no formato de URL. Uma pesquisa combina todos os pares com um AND lógico. Cada valor pode ser uma lista de valores separados por vírgulas, que são tratados como um OR lógico desses valores. Por exemplo, Patient?key1=value1&key2=value2,value3 é uma pesquisa em recursos de pacientes usando os seguintes critérios:

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

Não há sintaxe para executar um OR de dois pares name=value.

Cada tipo de recurso do FHIR define os próprios parâmetros de pesquisa em cada versão do FHIR. Os parâmetros disponíveis são documentados na especificação de FHIR para cada recurso. Veja um exemplo em Paciente R4 de FHIR. É possível recuperar os parâmetros de maneira programática usando a instrução de recurso. A API Cloud Healthcare suporta a maioria dos parâmetros de pesquisa. É possível encontrar exclusões usando a declaração de capacidade ou a declaração de conformidade com FHIR.

Paginação e classificação

O número de recursos retornados em cada página de resultados da pesquisa FHIR depende dos seguintes fatores:

  • O parâmetro _count. Ela controla o número máximo de recursos retornados do método de pesquisa. Por exemplo, _count=10 retorna, no máximo, 10 recursos que correspondem à consulta. O padrão é 100,e o valor máximo permitido é 1.000.
  • O tamanho dos dados da resposta. Uma página de resultados da pesquisa poderá retornar menos recursos do que o valor especificado no parâmetro _count se o tamanho da resposta for grande.

Se uma pesquisa retornar mais recursos do que o número de recursos que cabem em uma página, a resposta incluirá um URL de paginação no campo Bundle.link. Pode haver vários valores retornados nesse campo. O valor com Bundle.link.relation = next indica que é possível usar o Bundle.link.url correspondente para recuperar a próxima página.

O valor de Bundle.total indica o número total de recursos correspondentes. Esse valor é exato se os resultados se encaixarem totalmente em uma página, mas se tornará uma estimativa aproximada conforme o número de resultados se torna maior do que uma página. Para ver o total exato de uma pesquisa que corresponda a muitos resultados, siga os links de paginação várias vezes até que os resultados sejam esgotados.

Para mais informações sobre os totais de paginação e pesquisa, consulte Como implementar paginação e totais de pesquisa com a pesquisa FHIR.

É possível classificar os resultados usando o parâmetro _sort, que aceita uma lista separada por vírgulas de nomes de parâmetros de pesquisa em ordem de prioridade. É possível usar um prefixo - para indicar ordem decrescente. Por exemplo, a consulta a seguir classifica por status em ordem crescente, separando a data por ordem decrescente e todos os outros parâmetros de categoria por ordem crescente:

_sort=status,-date,category

Atraso na indexação

Como os recursos FHIR são indexados de modo assíncrono, pode haver um pequeno atraso entre o momento em que um recurso é criado ou alterado e o momento em que a alteração é refletida nos resultados da pesquisa. A única exceção são os dados do identificador de recursos, que são indexados de forma síncrona como um índice especial. Como resultado, a pesquisa usando o identificador de recurso não está sujeita a atraso de indexação. Para usar o índice síncrono especial, o termo de pesquisa para identificador deve estar no padrão identifier=[system]|[value] ou identifier=[value], e qualquer um dos parâmetros de resultados da pesquisa a seguir pode ser usado:

  • _count
  • _include
  • _revinclude
  • _summary
  • _elements

Se a consulta contiver outros parâmetros de pesquisa, o índice assíncrono padrão será usado. A pesquisa no índice especial é otimizada para resolver um pequeno número de correspondências. A pesquisa não será otimizada se os critérios de pesquisa do identificador corresponderem a um grande número (ou seja,mais de 2.000) de recursos. Para uma consulta de pesquisa que corresponda a um grande número de recursos, é possível evitar o uso do índice síncrono especial incluindo mais um parâmetro _sort na consulta. Use _sort=-_lastUpdated se quiser manter a ordem de classificação padrão.

Como pesquisar em todos os tipos de recursos

Alguns parâmetros de pesquisa, diferenciados por um sublinhado à esquerda, como _id, aplicam-se a todos os tipos de recursos. Esses parâmetros de todos os recursos estão listados na especificação FHIR referente ao tipo de recurso.

Ao usar esses parâmetros de pesquisa, você pode realizar uma pesquisa em vários tipos de recursos omitindo o tipo de recurso do caminho da solicitação. Por exemplo, usar GET .../fhir?_id=1234 em vez de GET .../fhir/Patient?_id=1234 pesquisa em todos os recursos de FHIR em vez de apenas em um recurso "Paciente". É possível usar o parâmetro especial _type com esse tipo de solicitação para limitar os resultados a uma lista separada por vírgulas de tipos de recursos. Por exemplo, a consulta a seguir retorna apenas resultados correspondentes para recursos Observation e Condition:

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

Tipos de dados

Cada parâmetro de pesquisa definido pelo FHIR tem um tipo de dados que inclui tipos primitivos, como os seguintes:

  • String
  • Número
  • Data

Os tipos de dados também incluem os seguintes tipos complexos:

  • Token
  • Referência
  • Quantidade

Cada tipo de dados tem sua própria sintaxe para especificar valores. Cada tipo de dados suporta modificadores que alteram como a pesquisa é realizada.

As seções a seguir mostram como usar tipos de dados. Para mais detalhes sobre outros tipos de dados, sintaxes de valor e modificadores, consulte Recursos avançados de pesquisa de FHIR.

Número

Pesquisa valores inteiros ou de ponto flutuante. Para alterar o comparador, prefixe o valor com um dos seguintes modificadores:

  • ne
  • lt
  • le
  • gt
  • ge

Por exemplo, use [parameter]=100 para igualdade ou [parameter]=ge100 para maior ou igual a 100.

Data

Pesquisa qualquer tipo de data, hora ou período. O formato do parâmetro de data é o seguinte:

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

Os mesmos modificadores de prefixo usados para número são aplicáveis.

String

O padrão é uma pesquisa de prefixo indiferente a maiúsculas, acentos ou outras marcas diacríticas.

Token

Pesquisa uma correspondência exata de string de um "código". É possível definir o escopo da pesquisa como o URI de um "sistema", indicando o valor que foi retirado do código usando o seguinte formato:

[parameter]=[system]|[code]

Por exemplo, a pesquisa a seguir corresponde a um código de 10738-3, mas somente quando qualificada como um valor de um sistema de codificação com o URI especificado:

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

Quantidade

Pesquisa um valor numérico usando os mesmos modificadores de prefixo de número. É possível qualificar a pesquisa com um sistema e código específicos indicando as unidades do valor no seguinte formato:

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

Por exemplo, a consulta a seguir pesquisa valores de quantidade inferiores a 9.1 que tenham o sistema de unidades e o código especificados:

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

Referência

Pesquisa referências entre recursos. É possível usar as consultas a seguir para referências a recursos dentro de um armazenamento de FHIR:

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

É possível usar [parameter]=[url] para especificar referências por URL que possam estar fora do armazenamento de FHIR.

Manipulação dos parâmetros de pesquisa

Por padrão, o método de pesquisa aplica um tratamento "flexível", que ignora os parâmetros que a pesquisa não reconhece. O método de pesquisa executa a pesquisa usando os parâmetros restantes na solicitação, o que pode retornar mais recursos do que o esperado.

A resposta inclui o seguinte:

  • Um valor em Bundle.link com um valor de Bundle.link.relation = self
  • Um Bundle.link.url de um URL contendo apenas os parâmetros que foram aplicados à pesquisa. Inspecione esse valor para determinar se algum parâmetro foi ignorado.

É possível definir o cabeçalho HTTP da solicitação como Prefer: handling=strict em uma solicitação de pesquisa. Definir o cabeçalho faz com que o armazenamento de FHIR retorne um erro em qualquer parâmetro não reconhecido.