Como pesquisar recursos FHIR

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

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

Nesta página, você verá o resumo de muitos dos recursos de pesquisa usados com frequência, mas não é uma lista completa de partes da especificação de pesquisa FHIR compatível com a API Cloud Healthcare.

Como usar o leitor FHIR

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

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

  1. No Console do Cloud, acesse a página do visualizador 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, pode pesquisar dados dentro dele.

Para pesquisar dados em um recurso, siga estas etapas:

  1. Selecione um recurso.

  2. No painel Leitor FHIR, clique na guia Elementos.

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

Como usar o método search

Para pesquisar recursos FHIR com a API REST, use o método projects.locations.datasets.fhirStores.fhir.search. Você pode chamar 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.jackson2.JacksonFactory;
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.impl.client.HttpClients;

public class FhirResourceSearchGet {
  private static final String FHIR_NAME =
      "projects/%s/locations/%s/datasets/%s/fhirStores/%s/fhir/%s";
  private static final JsonFactory JSON_FACTORY = new JacksonFactory();
  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", "store-id", "resource-type");

    // Initialize the client, which will be used to interact with the service.
    CloudHealthcare client = createClient();

    HttpClient httpClient = HttpClients.createDefault();
    String uri = String.format("%sv1/%s", client.getRootUrl(), resourceName);
    URIBuilder uriBuilder = new URIBuilder(uri).setParameter("access_token", getAccessToken());

    HttpUriRequest request =
        RequestBuilder.get()
            .setUri(uriBuilder.build())
            .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 GET FHIR resources: %s\n", response.getStatusLine().toString()));
      responseEntity.writeTo(System.err);
      throw new RuntimeException();
    }
    System.out.println("FHIR resource 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

const google = require('@googleapis/healthcare');
const healthcare = google.healthcare({
  version: 'v1',
  auth: new google.auth.GoogleAuth({
    scopes: ['https://www.googleapis.com/auth/cloud-platform'],
  }),
});

const searchFhirResourcesGet = async () => {
  // 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 parent = `projects/${projectId}/locations/${cloudRegion}/datasets/${datasetId}/fhirStores/${fhirStoreId}/fhir`;
  const request = {parent, resourceType};

  const response =
    await healthcare.projects.locations.datasets.fhirStores.fhir.search(
      request
    );
  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/master/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 = "{}/projects/{}/locations/{}".format(base_url, project_id, 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.jackson2.JacksonFactory;
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";
  private static final JsonFactory JSON_FACTORY = new JacksonFactory();
  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");

    // Initialize the client, which will be used to interact with the service.
    CloudHealthcare client = createClient();

    HttpClient httpClient = HttpClients.createDefault();
    String uri = String.format("%sv1/%s/_search", client.getRootUrl(), resourceName);
    URIBuilder uriBuilder = new URIBuilder(uri).setParameter("access_token", getAccessToken());
    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 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

const google = require('@googleapis/healthcare');
const healthcare = google.healthcare({
  version: 'v1',
  auth: new google.auth.GoogleAuth({
    scopes: ['https://www.googleapis.com/auth/cloud-platform'],
  }),
  method: 'POST',
});

const searchFhirResourcesPost = async () => {
  // 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 parent = `projects/${projectId}/locations/${cloudRegion}/datasets/${datasetId}/fhirStores/${fhirStoreId}/fhir`;
  const request = {parent, resourceType};

  const response =
    await healthcare.projects.locations.datasets.fhirStores.fhir.search(
      request
    );
  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/master/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 = "{}/projects/{}/locations/{}".format(base_url, project_id, location)

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

    resource_path = "{}/Patient/_search?family:exact=Smith".format(fhir_store_path)

    # 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 FHIR para cada recurso. Veja um exemplo em paciente FHIR. Você pode recuperar os parâmetros de maneira programática por meio da instrução de recurso. A API Cloud Healthcare é compatível com a maioria dos parâmetros de pesquisa. É possível encontrar exclusões por meio da declaração de capacidade ou da declaração de conformidade com FHIR.

Paginação e classificação

O parâmetro _count 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.

Se uma pesquisa retornar mais recursos do que o permitido em uma página, a resposta incluirá um URL de paginação no campo Bundle.link. Vários valores podem ser retornados nesse campo. o valor com Bundle.link.relation = next indica que você pode 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.

É 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, quebrando empates por data decrescente e quebrando todos os empates restantes por categoria crescente:

_sort=status,-date,category

Atraso na indexação

Os recursos FHIR são indexados de maneira assíncrona. Portanto, pode haver um pequeno atraso entre o momento em que um recurso é criado ou alterado e o momento em que a criação ou alteração é refletida nos resultados da pesquisa.

Como pesquisar em todos os tipos de recursos

Alguns parâmetros de pesquisa, mostrados por um sublinhado antes como _id, aplicam-se a todos os tipos de recursos. Esses parâmetros de todos os recursos são listados na especificação FHIR para o 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 FHIR em vez de apenas 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 é compatível com modificadores que alteram como a pesquisa é realizada.

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

Número

Pesquisa valores de número inteiro ou 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

Pesquisas em 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 number 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 number. É 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 possa estar fora do armazenamento 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.