Menelusuri resource FHIR

Halaman ini menjelaskan petunjuk dasar tentang cara menelusuri resource FHIR di penyimpanan FHIR. Menelusuri resource FHIR adalah cara utama untuk membuat kueri dan mendapatkan insight dari data FHIR.

Anda dapat menelusuri resource FHIR di Cloud Healthcare API dengan cara berikut:

Halaman ini merangkum banyak fitur penelusuran yang umum digunakan, tetapi bukan merupakan daftar lengkap dari spesifikasi penelusuran FHIR yang didukung oleh Cloud Healthcare API.

Menggunakan penampil FHIR

Penampil FHIR adalah halaman di Konsol Google Cloud yang memungkinkan Anda menelusuri dan melihat konten resource FHIR.

Untuk mencari resource di penyimpanan FHIR, selesaikan langkah-langkah berikut:

  1. Di konsol Google Cloud, buka halaman FHIR viewer.

    Buka penampil FHIR

  2. Di menu drop-down FHIR Store, pilih set data, lalu pilih penyimpanan FHIR dalam set data tersebut.

  3. Untuk memfilter daftar jenis resource, telusuri jenis resource yang ingin Anda tampilkan:

    1. Klik kolom Resource Type.

    2. Di menu drop-down Properties yang muncul, pilih Resource Type.

    3. Masukkan jenis fasilitas.

    4. Untuk menelusuri jenis resource lain, pilih ATAU dari menu drop-down Operator yang muncul, lalu masukkan jenis resource lain.

  4. Dalam daftar jenis resource, pilih jenis resource yang ingin Anda telusuri.

  5. Di kotak penelusuran untuk tabel resource yang muncul, masukkan nilai yang ingin Anda telusuri.

Penampil FHIR menampilkan hasil penelusuran dalam tabel. Setelah Anda memilih resource, penampil FHIR akan menampilkan konten resource.

Jika menampilkan konten resource, Anda dapat menelusuri data di dalam resource tersebut.

Untuk menelusuri data di dalam resource, ikuti langkah-langkah berikut:

  1. Pilih resource.

  2. Di panel FHIR viewer, klik tab Elements.

  3. Di kotak penelusuran, masukkan nilai yang ingin ditelusuri.

Mendownload data biner dalam resource FHIR

Untuk mendownload data biner yang tersedia dan terkait dengan resource di penampil FHIR, ikuti langkah-langkah berikut:

  1. Pilih resource.

  2. Di panel FHIR viewer, klik tab Elements.

  3. Jika perlu, perluas elemen untuk mengakses elemen resource yang diperlukan.

  4. Klik Download File untuk mendownload data yang tersedia.

Membuat dan menjalankan kueri penelusuran lanjutan

Anda dapat menggunakan kueri penelusuran lanjutan untuk menelusuri resource FHIR tertentu menggunakan spesifikasi penelusuran FHIR.

Untuk membuat kueri penelusuran lanjutan, selesaikan langkah-langkah berikut:

  1. Di halaman FHIR viewer, klik tab Search.

  2. Untuk membuat kueri penelusuran, klik Buka Pembuat kueri.

    Panel Pilihan Kueri ditampilkan.

  3. Dari daftar Select a FHIR resource type, pilih jenis resource FHIR yang ingin Anda telusuri.

  4. Klik Lanjutkan.

  5. Dari daftar Parameter, pilih parameter yang ingin Anda gunakan untuk menelusuri resource.

  6. Dari daftar Modifier, pilih pengubah untuk diterapkan ke kueri. Daftar ini hanya menyertakan pengubah yang kompatibel dengan jenis data parameter yang dipilih.

    Ini adalah pilihan opsional. Jika tidak ada pengubah yang dipilih, pemeriksaan kesamaan akan dilakukan.

  7. Di kolom Nilai, masukkan nilai parameter kueri.

  8. Untuk menambahkan lebih dari satu nilai parameter, klik ATAU. Tindakan ini memungkinkan Anda menyertakan beberapa nilai parameter resource dalam kueri penelusuran.

    Saat Anda membuat kueri penelusuran, kueri tersebut akan ditampilkan di panel Query Preview. Untuk melihat URL lengkap kueri penelusuran, klik Show full path.

  9. Untuk menambahkan lebih dari satu parameter, klik DAN.

  10. Klik Lanjutkan.

  11. Untuk menyertakan resource yang dirujuk oleh resource yang ditampilkan dalam kueri penelusuran, pilih parameter resource dari menu drop-down Parameter yang disertakan.

  12. Untuk menyertakan resource yang mereferensikan resource yang ditampilkan dalam kueri penelusuran Anda, pilih parameter resource dari menu drop-down Reverse parameter yang disertakan.

  13. Klik Selesai untuk menyimpan kueri penelusuran Anda.

    Kueri penelusuran tersimpan ditampilkan di kolom operasi penelusuran FHIR.

  14. Untuk menelusuri resource dengan kueri, klik Jalankan Penelusuran.

    Hasil penelusuran ditampilkan di daftar Hasil penelusuran. Untuk melihat detail resource yang ditampilkan oleh penelusuran, klik resource dalam daftar.

  15. Untuk menyimpan kueri sebagai template kueri, klik Save template dan pilih Save template atau Save template as. Anda akan diminta untuk memberi nama dan deskripsi kueri. Parameter kueri disimpan dalam template, tetapi nilai yang ditentukan akan dihapus.

Contoh kueri penelusuran

Contoh berikut menunjukkan kueri penelusuran yang menelusuri resource Klaim dari penyedia layanan kesehatan tertentu, Practitioner/12345, untuk bulan Agustus 2021:

  • Parameter: care-team
    • Nilai: Practitioner/12345
  • Operator: AND
  • Parameter: created
    • Awalan: lt (lesser than)
    • Nilai: 8/1/21, 12:00 AM
  • Operator: AND
  • Parameter: created
    • Awalan: gt (greater than)
    • Nilai: 8/31/21, 11:59 PM

Kueri ini dikonfigurasi sebagai berikut di panel Query Selection dan kueri dipratinjau di panel Query Preview. Kueri akan ditampilkan di kolom operasi penelusuran FHIR.

Kueri penelusuran lanjutan FHIR

Mengedit kueri penelusuran

Untuk mengedit kueri penelusuran, lakukan salah satu hal berikut:

  • Untuk mengedit kueri di pembuat kueri, klik Buka Pembuat Kueri.
  • Untuk mengedit kueri secara manual, edit parameter value di kotak teks.

Menjalankan template kueri

Untuk menjalankan kueri dari template tersimpan, selesaikan langkah-langkah berikut:

  1. Klik Template tersimpan.

    Tab Search templates di panel Query Selection ditampilkan, yang menampilkan semua template kueri tersimpan.

  2. Pilih template kueri yang ingin dijalankan, lalu klik Done.

    Kueri penelusuran template ditampilkan di kolom operasi penelusuran FHIR tanpa nilai apa pun.

  3. Untuk menentukan nilai kueri penelusuran Anda, edit nilai parameter dalam kolom.

  4. Klik Jalankan Penelusuran untuk menelusuri resource dengan kueri.

Menggunakan metode search

Untuk menelusuri resource FHIR dengan REST API, gunakan metode projects.locations.datasets.fhirStores.fhir.search. Anda dapat memanggil metode menggunakan permintaan GET atau POST.

Menggunakan metode search dengan GET

Contoh berikut menunjukkan cara menelusuri resource di penyimpanan FHIR tertentu menggunakan metode projects.locations.datasets.fhirStores.fhir.search dengan GET.

curl

Untuk menelusuri resource di penyimpanan FHIR, buat permintaan GET dan tentukan informasi berikut:

  • Nama set data
  • Nama toko FHIR
  • Jenis resource yang akan ditelusuri
  • String kueri yang berisi informasi yang Anda telusuri, seperti yang dijelaskan di bagian Membuat kueri penelusuran
  • Token akses

Contoh berikut menampilkan permintaan GET yang menggunakan curl untuk menelusuri semua pasien dengan nama belakang "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"

Jika permintaan berhasil, server akan menampilkan respons sebagai Bundle FHIR dalam format JSON. Bundle.type adalah searchset dan hasil penelusuran adalah entri dalam array Bundle.entry. Dalam contoh ini, permintaan menampilkan satu resource Pasien termasuk data di dalam resource tersebut:

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

Untuk menelusuri resource di penyimpanan FHIR, buat permintaan GET dan tentukan informasi berikut:

  • Nama set data
  • Nama toko FHIR
  • Jenis resource yang akan ditelusuri
  • String kueri yang berisi informasi yang Anda telusuri, seperti yang dijelaskan di bagian Membuat kueri penelusuran
  • Token akses

Contoh berikut menunjukkan permintaan GET menggunakan Windows PowerShell untuk menelusuri semua pasien dengan nama belakang "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

Jika permintaan berhasil, server akan menampilkan respons sebagai Bundle FHIR dalam format JSON. Bundle.type adalah searchset dan hasil penelusuran adalah entri dalam array Bundle.entry. Dalam contoh ini, permintaan menampilkan satu resource Pasien termasuk data di dalam resource tersebut:

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

Menggunakan metode search dengan POST

Contoh berikut menunjukkan cara menelusuri resource di penyimpanan FHIR tertentu menggunakan metode projects.locations.datasets.fhirStores.fhir.search dengan POST.

curl

Untuk menelusuri resource di penyimpanan FHIR, buat permintaan POST dan tentukan informasi berikut:

  • Nama set data
  • Nama toko FHIR
  • Jenis resource yang akan ditelusuri
  • String kueri yang berisi informasi yang Anda telusuri, seperti yang dijelaskan di bagian Membuat kueri penelusuran
  • Token akses

Contoh berikut menampilkan permintaan POST yang menggunakan curl untuk menelusuri semua pasien dengan nama belakang "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"

Jika permintaan berhasil, server akan menampilkan respons sebagai Bundle FHIR dalam format JSON. Bundle.type adalah searchset dan hasil penelusuran adalah entri dalam array Bundle.entry. Dalam contoh ini, permintaan menampilkan satu resource Pasien termasuk data di dalam resource tersebut:

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

Untuk menelusuri resource di penyimpanan FHIR, buat permintaan POST dan tentukan informasi berikut:

  • Nama set data
  • Nama toko FHIR
  • Jenis resource yang akan ditelusuri
  • String kueri yang berisi informasi yang Anda telusuri, seperti yang dijelaskan di bagian Membuat kueri penelusuran
  • Token akses

Contoh berikut menunjukkan permintaan POST menggunakan Windows PowerShell untuk menelusuri semua pasien dengan nama belakang "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

Jika permintaan berhasil, server akan menampilkan respons sebagai Bundle FHIR dalam format JSON. Bundle.type adalah searchset dan hasil penelusuran adalah entri dalam array Bundle.entry. Dalam contoh ini, permintaan menampilkan satu resource Pasien termasuk data di dalam resource tersebut:

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

Membuat kueri penelusuran

String kueri adalah serangkaian pasangan name=value yang dienkode dalam bentuk URL. Penelusuran menggabungkan semua pasangan dengan AND yang logis. Setiap nilai dapat berupa daftar nilai yang dipisahkan koma, yang diperlakukan sebagai OR logis dari nilai tersebut. Misalnya, Patient?key1=value1&key2=value2,value3 adalah penelusuran pada resource Pasien menggunakan kriteria berikut:

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

Tidak ada sintaksis untuk melakukan OR dari dua pasangan name=value.

Setiap jenis resource FHIR menentukan parameter penelusurannya sendiri dalam setiap versi FHIR. Parameter yang tersedia didokumentasikan dalam spesifikasi FHIR untuk setiap resource. Sebagai contoh, lihat Pasien FHIR R4. Anda dapat mengambil parameter secara terprogram melalui pernyataan kemampuan. Cloud Healthcare API mendukung sebagian besar parameter penelusuran; Anda dapat menemukan pengecualian melalui pernyataan kemampuan atau pernyataan kesesuaian FHIR.

Penomoran halaman dan pengurutan

Jumlah resource yang ditampilkan di setiap halaman hasil penelusuran FHIR bergantung pada faktor-faktor berikut:

  • Parameter _count. Hal ini mengontrol jumlah maksimum resource yang ditampilkan dari metode penelusuran. Misalnya, _count=10 menampilkan maksimal 10 resource yang cocok dengan kueri. Nilai defaultnya adalah 100 dan nilai maksimum yang diizinkan adalah 1.000.
  • Ukuran data respons. Halaman hasil penelusuran mungkin menampilkan resource yang lebih sedikit daripada nilai yang ditentukan dalam parameter _count jika ukuran responsnya besar.

Jika penelusuran menampilkan lebih banyak resource daripada jumlah resource yang sesuai dalam satu halaman, responsnya akan menyertakan URL penomoran halaman di kolom Bundle.link. Mungkin ada beberapa nilai yang ditampilkan dalam kolom ini; nilai dengan Bundle.link.relation = next menunjukkan bahwa Anda dapat menggunakan Bundle.link.url yang sesuai untuk mengambil halaman berikutnya.

Nilai Bundle.total menunjukkan jumlah total resource yang cocok. Nilai ini tepat jika hasilnya pas sepenuhnya dalam satu halaman, tetapi menjadi perkiraan kasar karena jumlah hasil menjadi lebih dari satu halaman. Anda bisa mendapatkan total persis untuk penelusuran yang cocok dengan banyak hasil dengan mengikuti link penomoran halaman berulang kali hingga hasilnya habis.

Untuk informasi selengkapnya tentang penomoran halaman dan total penelusuran, lihat Menerapkan penomoran halaman dan total penelusuran dengan penelusuran FHIR.

Anda dapat mengurutkan hasil menggunakan parameter _sort, yang menerima daftar nama parameter penelusuran yang dipisahkan koma dalam urutan prioritas. Anda dapat menggunakan awalan - untuk menunjukkan urutan yang menurun. Misalnya, kueri berikut diurutkan berdasarkan status secara menaik, nilai ikatan berdasarkan tanggal menurun, dan membagi ikatan yang tersisa berdasarkan kategori yang menaik:

_sort=status,-date,category

Penundaan pengindeksan

Resource FHIR diindeks secara asinkron, sehingga mungkin ada sedikit penundaan antara waktu pembuatan atau perubahan resource, dan waktu saat perubahan muncul di hasil penelusuran. Satu-satunya pengecualian adalah data ID resource, yang diindeks secara sinkron sebagai indeks khusus. Akibatnya, penelusuran menggunakan ID resource tidak terkena penundaan pengindeksan. Untuk menggunakan indeks sinkron khusus, istilah penelusuran untuk ID harus dalam pola identifier=[system]|[value] atau identifier=[value], dan salah satu parameter hasil penelusuran berikut dapat digunakan:

  • _count
  • _include
  • _revinclude
  • _summary
  • _elements

Jika kueri Anda berisi parameter penelusuran lain, indeks asinkron standar akan digunakan. Perhatikan bahwa penelusuran terhadap indeks khusus dioptimalkan untuk menyelesaikan sejumlah kecil kecocokan. Penelusuran tidak akan dioptimalkan jika kriteria penelusuran ID Anda cocok dengan sejumlah besar (yaitu lebih dari 2.000) resource. Untuk kueri penelusuran yang akan cocok dengan sejumlah besar resource, Anda dapat menghindari penggunaan indeks sinkron khusus dengan menyertakan parameter _sort tambahan dalam kueri. Gunakan _sort=-_lastUpdated jika Anda ingin mempertahankan urutan penyortiran default.

Menelusuri di semua jenis resource

Parameter penelusuran tertentu, yang ditunjukkan dengan garis bawah di awal seperti _id, berlaku untuk semua jenis resource. Parameter semua resource ini tercantum dalam spesifikasi FHIR untuk Jenis resource.

Saat menggunakan parameter penelusuran ini, Anda dapat melakukan penelusuran di beberapa jenis resource dengan menghilangkan jenis resource dari jalur permintaan. Misalnya, menggunakan penelusuran GET .../fhir?_id=1234, bukan GET .../fhir/Patient?_id=1234, di semua resource FHIR, bukan hanya resource Pasien. Anda dapat menggunakan parameter khusus _type dengan jenis permintaan ini untuk membatasi hasilnya ke daftar jenis resource yang dipisahkan koma. Misalnya, kueri berikut hanya menampilkan hasil yang cocok untuk resource Observation dan Condition:

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

Jenis data

Setiap parameter penelusuran yang ditentukan oleh FHIR memiliki jenis data yang mencakup jenis primitif seperti berikut:

  • String
  • Nomor
  • Tanggal

Jenis data juga mencakup jenis kompleks berikut:

  • Token
  • Referensi
  • Jumlah

Setiap jenis data memiliki sintaksis sendiri untuk menentukan nilai. Setiap jenis data mendukung pengubah yang mengubah cara penelusuran dilakukan.

Bagian berikut menunjukkan cara menggunakan jenis data. Untuk detail selengkapnya tentang jenis data, sintaksis nilai, dan pengubah tambahan, lihat Fitur penelusuran FHIR lanjutan.

Nomor

Menelusuri nilai bilangan bulat atau nilai floating point. Untuk mengubah pembanding, awali nilai dengan salah satu pengubah berikut:

  • ne
  • lt
  • le
  • gt
  • ge

Misalnya, gunakan [parameter]=100 untuk kesetaraan, atau gunakan [parameter]=ge100 untuk lebih besar dari atau sama dengan 100.

Tanggal

Menelusuri jenis tanggal, waktu, atau periode apa pun. Format parameter tanggal adalah sebagai berikut:

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

Pengubah awalan yang sama yang digunakan untuk angka berlaku.

String

Setelan defaultnya adalah penelusuran awalan yang tidak peka terhadap huruf besar/kecil, aksen, atau tanda diakritik lainnya.

Token

Menelusuri string yang sama persis untuk "kode". Anda dapat mencakup penelusuran ke URI "sistem" yang menunjukkan kumpulan nilai yang diambil kode menggunakan format berikut:

[parameter]=[system]|[code]

Misalnya, penelusuran berikut cocok dengan kode 10738-3, tetapi hanya jika memenuhi syarat sebagai nilai dari sistem coding dengan URI yang ditentukan:

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

Jumlah

Menelusuri nilai numerik menggunakan pengubah awalan yang sama seperti angka. Penelusuran dapat dikualifikasikan dengan sistem dan kode tertentu yang menunjukkan satuan nilai dalam format berikut:

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

Misalnya, kueri berikut mencari nilai kuantitas kurang dari 9,1 yang memiliki sistem dan kode unit yang ditentukan:

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

Referensi

Menelusuri referensi antar-resource. Anda dapat menggunakan kueri berikut untuk referensi ke resource di dalam penyimpanan FHIR:

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

Anda dapat menggunakan [parameter]=[url] untuk menentukan referensi menurut URL yang mungkin berada di luar penyimpanan FHIR.

Penanganan parameter penelusuran

Secara default, metode penelusuran menerapkan penanganan "longgar", yang mengabaikan parameter yang tidak dikenali oleh penelusuran. Metode penelusuran akan melakukan penelusuran menggunakan parameter lainnya dalam permintaan, yang mungkin menampilkan lebih banyak resource dari yang diharapkan.

Responsnya mencakup hal berikut:

  • Nilai di Bundle.link dengan nilai Bundle.link.relation = self
  • Bundle.link.url URL yang hanya berisi parameter yang berhasil diterapkan pada penelusuran. Anda dapat memeriksa nilai ini untuk menentukan apakah ada parameter yang diabaikan.

Anda dapat menetapkan header HTTP permintaan ke Prefer: handling=strict pada permintaan penelusuran. Menyetel header akan menyebabkan penyimpanan FHIR menampilkan error pada parameter yang tidak dikenal.