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 bagian 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 menelusuri 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.

  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 resource.

    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.

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

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 Anda telusuri.

Mendownload data biner dalam resource FHIR

Untuk mendownload data biner yang tersedia yang terkait dengan resource di penampil 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 Buka Builder kueri.

    Panel Query Selection 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 kesetaraan akan dilakukan.

  7. Di kolom Value, masukkan nilai parameter kueri.

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

    Saat Anda membuat kueri penelusuran, kueri akan ditampilkan di panel Query Preview. 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 direferensikan 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 Reverse included parameters.

  13. Klik Selesai untuk menyimpan kueri penelusuran Anda.

    Kueri penelusuran tersimpan ditampilkan di kolom Operasi penelusuran FHIR.

  14. Untuk menelusuri referensi dengan kueri, klik Run Search.

    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 Save template, lalu pilih Save template atau Save template as. Anda akan diminta untuk memasukkan nama dan deskripsi kueri. Parameter kueri disimpan dalam template, tetapi nilai apa pun 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
    • Awal: lt (lesser than)
    • Nilai: 8/1/21, 12:00 AM
  • Operator: AND
  • Parameter: created
    • Awal: gt (greater than)
    • Nilai: 8/31/21, 11:59 PM

Hal ini dikonfigurasi sebagai berikut di panel Query Selection dan kueri ditampilkan 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 builder kueri, klik Buka Builder Kueri.
  • 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 Template penelusuran di panel Pemilihan Kueri akan ditampilkan, yang menampilkan semua template kueri tersimpan.

  2. Pilih template kueri yang ingin dijalankan, 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.

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 telusuri, seperti yang dijelaskan di bagian Membuat kueri penelusuran
  • Token akses

Contoh berikut menunjukkan 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 penyimpanan 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 penyimpanan 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 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 penyimpanan 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 di Referensi 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. Untuk 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 kepatuhan FHIR.

Pengurutan dan penomoran halaman

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 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 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 seluruhnya muat dalam satu halaman, tetapi menjadi perkiraan kasar karena jumlah hasil menjadi lebih besar dari satu halaman. Anda bisa mendapatkan total persis untuk penelusuran yang cocok dengan banyak hasil dengan mengikuti link penomoran halaman berulang kali hingga hasil selesai.

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 menurun. Misalnya, kueri berikut mengurutkan berdasarkan status menaik, memecahkan hasil seri berdasarkan tanggal menurun, dan memecahkan hasil seri yang tersisa berdasarkan kategori menaik:

_sort=status,-date,category

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 akan 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 me-resolve sejumlah kecil kecocokan. Penelusuran tidak dioptimalkan jika kriteria penelusuran ID Anda cocok dengan resource dalam jumlah besar (yaitu lebih dari 2.000). Untuk kueri penelusuran yang akan cocok dengan banyak resource, Anda dapat menghindari penggunaan indeks sinkron khusus dengan menyertakan parameter _sort tambahan dalam kueri. Gunakan _sort=-_lastUpdated jika Anda ingin mempertahankan urutan pengurutan default.

Menelusuri di semua jenis resource

Parameter penelusuran tertentu, yang ditampilkan 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 menghapus jenis resource dari jalur permintaan. Misalnya, menggunakan GET .../fhir?_id=1234, bukan GET .../fhir/Patient?_id=1234, akan menelusuri di semua resource FHIR, bukan hanya resource Pasien. Anda dapat menggunakan parameter khusus _type dengan jenis permintaan ini untuk membatasi hasil pada 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, sintaksis nilai, dan pengubah tambahan, lihat Fitur penelusuran FHIR lanjutan.

Angka

Menelusuri nilai bilangan bulat atau floating point. Untuk mengubah pembanding, beri awalan 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 semua jenis tanggal, waktu, atau periode. 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 menggunakan penelusuran awalan yang tidak peka huruf besar/kecil, aksen, atau tanda diakritik lainnya.

Token

Menelusuri kecocokan string persis dari "kode". Anda dapat menentukan cakupan penelusuran ke URI "sistem" yang menunjukkan nilai yang ditetapkan tempat kode diambil 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 unit nilai dalam format berikut:

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

Misalnya, kueri berikut menelusuri nilai jumlah kurang dari 9,1 yang memiliki sistem dan kode satuan 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 penelusuran. Metode penelusuran melakukan penelusuran menggunakan parameter yang tersisa dalam permintaan, yang mungkin menampilkan lebih banyak resource daripada 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 ke 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. Menetapkan header akan menyebabkan penyimpanan FHIR menampilkan error pada parameter yang tidak dikenal.