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 daftar lengkap bagian dari spesifikasi penelusuran FHIR yang didukung oleh Cloud Healthcare API.

Menggunakan FHIR viewer

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

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

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

    Buka FHIR viewer

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

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

    1. Klik kolom Jenis Resource.

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

    3. Masukkan jenis resource.

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

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

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

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

Saat melihat isi resource, Anda dapat menelusuri data di dalam resource.

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

  1. Pilih referensi.

  2. Di panel FHIR viewer, klik tab Elements.

  3. Di kotak penelusuran, masukkan nilai yang ingin Anda telusuri.

Mendownload data biner dalam resource FHIR

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

  1. Pilih resource.

  2. Di panel FHIR viewer, klik tab Elements.

  3. Jika perlu, luaskan 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 Open query Builder.

    Panel Pemilihan Kueri akan ditampilkan.

  3. Dari daftar Pilih jenis resource FHIR, 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 Pengubah, pilih pengubah yang akan diterapkan ke kueri. Daftar hanya menyertakan pengubah yang kompatibel dengan jenis data parameter yang dipilih.

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

  7. Di kolom Nilai, masukkan nilai parameter kueri.

  8. Untuk menambahkan lebih dari satu nilai parameter, klik OR. Dengan begitu, Anda dapat menyertakan beberapa nilai parameter resource dalam kueri penelusuran.

    Saat Anda membuat kueri penelusuran, kueri akan ditampilkan di panel Pratinjau Kueri. Untuk melihat URL lengkap kueri penelusuran, klik Tampilkan jalur lengkap.

  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 daftar drop-down Parameter yang disertakan.

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

  13. Klik Selesai untuk menyimpan kueri penelusuran Anda.

    Kueri penelusuran tersimpan ditampilkan di kolom operasi penelusuran FHIR.

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

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

  15. Untuk menyimpan kueri sebagai template kueri, klik Simpan template, lalu pilih Simpan template atau Simpan template sebagai. Anda akan diminta untuk memasukkan 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, Praktisi/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

Hal ini dikonfigurasi sebagai berikut di panel Query Selection dan kueri akan dilihat pratinjaunya di panel Query Preview. Kueri akan ditampilkan di kolom FHIR search operation.

Kueri penelusuran lanjutan FHIR

Mengedit kueri penelusuran

Untuk mengedit kueri penelusuran, lakukan salah satu hal berikut:

  • Untuk mengedit kueri di query builder, klik Open Query Builder.
  • Untuk mengedit kueri secara manual, edit nilai parameter di kotak teks.

Menjalankan template kueri

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

  1. Klik Template tersimpan.

    Tab Telusuri template di panel Pemilihan Kueri ditampilkan, yang menampilkan semua template kueri tersimpan.

  2. Pilih template kueri yang ingin Anda jalankan, lalu klik Selesai.

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

  3. Untuk menentukan nilai kueri penelusuran, edit nilai parameter di kolom.

  4. Klik Jalankan Penelusuran untuk menelusuri referensi dengan kueri.

Membagikan resource FHIR

Anda dapat membagikan link ke versi saat ini atau historis resource FHIR.

Konsol

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

    Buka FHIR viewer

  2. Di menu FHIR store, pilih set data, lalu pilih FHIR store di set data.

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

  4. Klik kolom Jenis resource.

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

  6. Masukkan jenis resource FHIR.

  7. Dalam daftar jenis resource FHIR, pilih jenis resource.

  8. Di tabel resource FHIR yang muncul, pilih atau telusuri resource.

  9. Di panel FHIR viewer, klik Bagikan. Link untuk membagikan resource FHIR disalin secara otomatis ke papan klip.

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 penyimpanan FHIR
  • Jenis resource yang akan ditelusuri
  • String kueri yang berisi informasi yang Anda cari, seperti yang dijelaskan di bagian Membuat kueri penelusuran
  • Token akses

Contoh berikut menunjukkan permintaan GET 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 FHIR Bundle 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 penyimpanan FHIR
  • Jenis resource yang akan ditelusuri
  • String kueri yang berisi informasi yang Anda cari, 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 FHIR Bundle 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 penyimpanan FHIR
  • Jenis resource yang akan ditelusuri
  • String kueri yang berisi informasi yang Anda cari, seperti yang dijelaskan di bagian Membuat kueri penelusuran
  • Token akses

Contoh berikut menunjukkan permintaan POST 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 FHIR Bundle 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 penyimpanan FHIR
  • Jenis resource yang akan ditelusuri
  • String kueri yang berisi informasi yang Anda cari, 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 FHIR Bundle 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 logis. Setiap nilai dapat berupa daftar nilai yang dipisahkan koma, yang diperlakukan sebagai OR logis dari nilai-nilai tersebut. Misalnya, Patient?key1=value1&key2=value2,value3 adalah penelusuran di Sumber daya 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 di setiap versi FHIR. Parameter yang tersedia didokumentasikan dalam spesifikasi FHIR untuk setiap resource. Sebagai contoh, lihat FHIR R4 Patient. 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 kepatuhan FHIR.

Penomoran halaman dan pengurutan

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

  • Parameter _count. Atribut ini mengontrol jumlah maksimum resource yang ditampilkan dari metode penelusuran. Misalnya, _count=10 akan menampilkan paling banyak 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 lebih sedikit resource daripada nilai yang ditentukan dalam parameter _count jika ukuran respons besar.

Jika penelusuran menampilkan lebih banyak resource daripada jumlah resource yang muat di satu halaman, respons akan menyertakan URL penomoran halaman di kolom Bundle.link. Mungkin ada beberapa nilai yang ditampilkan di 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 hasil sepenuhnya sesuai dalam satu halaman, tetapi menjadi perkiraan kasar saat jumlah hasil lebih besar dari satu halaman. Anda dapat memperoleh total yang tepat untuk penelusuran yang cocok dengan banyak hasil dengan mengikuti link penomoran halaman berulang kali hingga hasilnya habis.

Untuk mengetahui informasi selengkapnya tentang penomoran halaman dan total penelusuran, lihat artikel 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 menurun. Misalnya, kueri berikut mengurutkan menurut status menaik, memecahkan ikatan menurut tanggal menurun, dan memecahkan ikatan yang tersisa menurut kategori menaik:

_sort=status,-date,category

_sort hanya didukung untuk parameter penelusuran berjenis number, data, string, token, dan quantity. Untuk mengurutkan menggunakan jenis parameter penelusuran lainnya (misalnya, reference), gunakan penelusuran kustom FHIR untuk membuat, misalnya, parameter penelusuran string di kolom reference.

Penundaan pengindeksan

Resource FHIR diindeks secara asinkron, sehingga mungkin ada sedikit penundaan antara waktu resource dibuat atau diubah, dan waktu perubahan tercermin dalam hasil penelusuran. Satu-satunya pengecualian adalah data ID resource, yang diindeks secara sinkron sebagai indeks khusus. Akibatnya, penelusuran menggunakan ID resource tidak mengalami 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 lainnya, indeks asinkron standar akan digunakan. Perhatikan bahwa penelusuran terhadap indeks khusus dioptimalkan untuk menyelesaikan sejumlah kecil kecocokan. Penelusuran tidak 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 Anda. Gunakan _sort=-_lastUpdated jika Anda ingin mempertahankan urutan pengurutan default.

Menelusuri semua jenis resource

Parameter penelusuran tertentu, yang ditunjukkan dengan garis bawah di depannya seperti _id, berlaku untuk semua jenis resource. Semua parameter 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 GET .../fhir?_id=1234, bukan GET .../fhir/Patient?_id=1234, akan menelusuri semua resource FHIR, bukan hanya resource Patient. Anda dapat menggunakan parameter khusus _type dengan jenis permintaan ini untuk membatasi hasil 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
  • Angka
  • Tanggal

Jenis data juga mencakup jenis kompleks berikut:

  • Token
  • Referensi
  • Kuantitas

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

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

Angka

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

  • ne
  • lt
  • le
  • gt
  • ge

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

Tanggal

Penelusuran pada 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 number berlaku.

String

Secara default, penelusuran awalan tidak peka terhadap huruf besar/kecil, aksen, atau tanda diakritik lainnya.

Token

Menelusuri kecocokan string persis dari "kode". Anda dapat mencakup penelusuran ke URI "sistem" yang menunjukkan nilai yang ditetapkan kode diambil dari 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

Kuantitas

Menelusuri nilai numerik menggunakan pengubah awalan yang sama dengan number. Anda dapat memenuhi syarat penelusuran dengan sistem dan kode tertentu yang menunjukkan satuan nilai dalam format berikut:

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

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

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 melakukan penelusuran menggunakan parameter yang tersisa dalam permintaan, yang dapat menampilkan lebih banyak resource daripada yang diharapkan.

Responsnya mencakup hal berikut:

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

Anda dapat menyetel header HTTP permintaan menjadi Prefer: handling=strict pada permintaan penelusuran. Menetapkan header menyebabkan penyimpanan FHIR menampilkan error pada parameter yang tidak dikenali.