FHIR 리소스 검색

이 페이지에서는 projects.locations.datasets.fhirStores.fhir.search 메서드를 사용하여 지정된 FHIR 저장소에서 리소스를 검색하는 방법을 보여줍니다. GET 또는 POST 요청을 사용하여 여러 방법으로 메서드를 호출할 수 있습니다. FHIR 검색 사양에는 다양한 쿼리 기능 집합이 포함됩니다. 이 페이지에서 일반적으로 사용되는 여러 기능을 요약해서 보여주지만, 이 목록은 Cloud Healthcare API로 지원되는 검색 사양의 전체 목록이 아닙니다.

GETsearch 메서드 사용하기

다음 샘플은 GET으로 projects.locations.datasets.fhirStores.fhir.search 메서드를 사용해서 지정된 FHIR 저장소에서 리소스를 검색하는 방법을 보여줍니다.

curl

FHIR 저장소의 리소스를 검색하려면 GET 요청을 수행하고 다음 정보를 지정합니다.

  • 데이터 세트의 이름
  • FHIR 저장소의 이름
  • 검색할 리소스 유형
  • 검색 쿼리 구성하기 섹션에 설명된 대로 검색중인 정보가 포함된 쿼리 문자열
  • 액세스 토큰

다음 샘플은 성이 'Smith'인 모든 환자를 검색하기 위해 curl을 사용하는 GET 요청을 보여줍니다.

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"

요청이 성공하면 서버가 JSON 형식의 FHIR Bundle로 응답을 반환합니다. Bundle.typesearchset이며 검색 결과는 Bundle.entry 배열의 항목입니다. 이 예시에서 요청은 해당 리소스 내의 데이터가 포함된 단일 환자 리소스를 반환합니다.

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

FHIR 저장소의 리소스를 검색하려면 GET 요청을 수행하고 다음 정보를 지정합니다.

  • 데이터 세트의 이름
  • FHIR 저장소의 이름
  • 검색할 리소스 유형
  • 검색 쿼리 구성하기 섹션에 설명된 대로 검색중인 정보가 포함된 쿼리 문자열
  • 액세스 토큰

다음 샘플은 성이 'Smith'인 모든 환자를 검색하기 위해 Windows PowerShell을 사용하는 GET 요청을 보여줍니다.

$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

요청이 성공하면 서버가 JSON 형식의 FHIR Bundle로 응답을 반환합니다. Bundle.typesearchset이며 검색 결과는 Bundle.entry 배열의 항목입니다. 이 예시에서 요청은 해당 리소스 내의 데이터가 포함된 단일 환자 리소스를 반환합니다.

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

자바

import com.google.api.client.http.HttpRequestInitializer;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.healthcare.v1.CloudHealthcare;
import com.google.api.services.healthcare.v1.CloudHealthcareScopes;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.Collections;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.methods.RequestBuilder;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.impl.client.HttpClients;

public class FhirResourceSearchGet {
  private static final String FHIR_NAME =
      "projects/%s/locations/%s/datasets/%s/fhirStores/%s/fhir/%s";
  private static final JsonFactory JSON_FACTORY = new JacksonFactory();
  private static final NetHttpTransport HTTP_TRANSPORT = new NetHttpTransport();

  public static void fhirResourceSearchGet(String resourceName)
      throws IOException, URISyntaxException {
    // String resourceName =
    //    String.format(
    //        FHIR_NAME, "project-id", "region-id", "dataset-id", "store-id", "resource-type");

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

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

    HttpUriRequest request =
        RequestBuilder.get()
            .setUri(uriBuilder.build())
            .addHeader("Content-Type", "application/fhir+json")
            .addHeader("Accept-Charset", "utf-8")
            .addHeader("Accept", "application/fhir+json; charset=utf-8")
            .build();

    // Execute the request and process the results.
    HttpResponse response = httpClient.execute(request);
    HttpEntity responseEntity = response.getEntity();
    if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
      System.err.print(
          String.format(
              "Exception searching GET FHIR resources: %s\n", response.getStatusLine().toString()));
      responseEntity.writeTo(System.err);
      throw new RuntimeException();
    }
    System.out.println("FHIR resource search results: ");
    responseEntity.writeTo(System.out);
  }

  private static CloudHealthcare createClient() throws IOException {
    // Use Application Default Credentials (ADC) to authenticate the requests
    // For more information see https://cloud.google.com/docs/authentication/production
    GoogleCredentials credential =
        GoogleCredentials.getApplicationDefault()
            .createScoped(Collections.singleton(CloudHealthcareScopes.CLOUD_PLATFORM));

    // Create a HttpRequestInitializer, which will provide a baseline configuration to all requests.
    HttpRequestInitializer requestInitializer =
        request -> {
          new HttpCredentialsAdapter(credential).initialize(request);
          request.setConnectTimeout(60000); // 1 minute connect timeout
          request.setReadTimeout(60000); // 1 minute read timeout
        };

    // Build the client for interacting with the service.
    return new CloudHealthcare.Builder(HTTP_TRANSPORT, JSON_FACTORY, requestInitializer)
        .setApplicationName("your-application-name")
        .build();
  }

  private static String getAccessToken() throws IOException {
    GoogleCredentials credential =
        GoogleCredentials.getApplicationDefault()
            .createScoped(Collections.singleton(CloudHealthcareScopes.CLOUD_PLATFORM));

    return credential.refreshAccessToken().getTokenValue();
  }
}

Node.js

const {google} = require('googleapis');
const healthcare = google.healthcare('v1');

const searchFhirResourcesGet = async () => {
  const auth = await google.auth.getClient({
    scopes: ['https://www.googleapis.com/auth/cloud-platform'],
  });
  google.options({auth});

  // TODO(developer): uncomment these lines before running the sample
  // const cloudRegion = 'us-central1';
  // const projectId = 'adjective-noun-123';
  // const datasetId = 'my-dataset';
  // const fhirStoreId = 'my-fhir-store';
  // const resourceType = 'Patient';
  const parent = `projects/${projectId}/locations/${cloudRegion}/datasets/${datasetId}/fhirStores/${fhirStoreId}/fhir`;
  const request = {parent, resourceType};

  const response = await healthcare.projects.locations.datasets.fhirStores.fhir.search(
    request
  );
  const resources = response.data.entry;
  console.log(`Resources found: ${resources.length}`);
  console.log(JSON.stringify(resources, null, 2));
};

searchFhirResourcesGet();

Python

def search_resources_get(
    base_url, project_id, cloud_region, dataset_id, fhir_store_id, resource_type,
):
    """
    Searches resources in the given FHIR store.

    It uses the searchResources GET method.
    """
    url = "{}/projects/{}/locations/{}".format(base_url, project_id, cloud_region)

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

    # Make an authenticated API request
    session = get_session()

    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

POSTsearch 메서드 사용하기

다음 샘플은 POST으로 projects.locations.datasets.fhirStores.fhir.search 메서드를 사용해서 지정된 FHIR 저장소에서 리소스를 검색하는 방법을 보여줍니다.

curl

FHIR 저장소의 리소스를 검색하려면 POST 요청을 수행하고 다음 정보를 지정합니다.

  • 데이터 세트의 이름
  • FHIR 저장소의 이름
  • 검색할 리소스 유형
  • 검색 쿼리 구성하기 섹션에 설명된 대로 검색중인 정보가 포함된 쿼리 문자열
  • 액세스 토큰

다음 샘플은 성이 'Smith'인 모든 환자를 검색하기 위해 curl을 사용하는 POST 요청을 보여줍니다.

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"

요청이 성공하면 서버가 JSON 형식의 FHIR Bundle로 응답을 반환합니다. Bundle.typesearchset이며 검색 결과는 Bundle.entry 배열의 항목입니다. 이 예시에서 요청은 해당 리소스 내의 데이터가 포함된 단일 환자 리소스를 반환합니다.

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

FHIR 저장소의 리소스를 검색하려면 POST 요청을 수행하고 다음 정보를 지정합니다.

  • 데이터 세트의 이름
  • FHIR 저장소의 이름
  • 검색할 리소스 유형
  • 검색 쿼리 구성하기 섹션에 설명된 대로 검색중인 정보가 포함된 쿼리 문자열
  • 액세스 토큰

다음 샘플은 성이 'Smith'인 모든 환자를 검색하기 위해 Windows PowerShell을 사용하는 POST 요청을 보여줍니다.

$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

요청이 성공하면 서버가 JSON 형식의 FHIR Bundle로 응답을 반환합니다. Bundle.typesearchset이며 검색 결과는 Bundle.entry 배열의 항목입니다. 이 예시에서 요청은 해당 리소스 내의 데이터가 포함된 단일 환자 리소스를 반환합니다.

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

자바

import com.google.api.client.http.HttpRequestInitializer;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.healthcare.v1.CloudHealthcare;
import com.google.api.services.healthcare.v1.CloudHealthcareScopes;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.Collections;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.methods.RequestBuilder;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.HttpClients;

public class FhirResourceSearchPost {
  private static final String FHIR_NAME =
      "projects/%s/locations/%s/datasets/%s/fhirStores/%s/fhir/%s";
  private static final JsonFactory JSON_FACTORY = new JacksonFactory();
  private static final NetHttpTransport HTTP_TRANSPORT = new NetHttpTransport();

  public static void fhirResourceSearchPost(String resourceName)
      throws IOException, URISyntaxException {
    // String resourceName =
    //    String.format(
    //        FHIR_NAME, "project-id", "region-id", "dataset-id", "store-id", "resource-type");

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

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

    HttpUriRequest request =
        RequestBuilder.post()
            .setUri(uriBuilder.build())
            .setEntity(requestEntity)
            .addHeader("Content-Type", "application/fhir+json")
            .addHeader("Accept-Charset", "utf-8")
            .addHeader("Accept", "application/fhir+json; charset=utf-8")
            .build();

    // Execute the request and process the results.
    HttpResponse response = httpClient.execute(request);
    HttpEntity responseEntity = response.getEntity();
    if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
      System.err.print(
          String.format(
              "Exception searching POST FHIR resources: %s\n",
              response.getStatusLine().toString()));
      responseEntity.writeTo(System.err);
      throw new RuntimeException();
    }
    System.out.println("FHIR resource search results: ");
    responseEntity.writeTo(System.out);
  }

  private static CloudHealthcare createClient() throws IOException {
    // Use Application Default Credentials (ADC) to authenticate the requests
    // For more information see https://cloud.google.com/docs/authentication/production
    GoogleCredentials credential =
        GoogleCredentials.getApplicationDefault()
            .createScoped(Collections.singleton(CloudHealthcareScopes.CLOUD_PLATFORM));

    // Create a HttpRequestInitializer, which will provide a baseline configuration to all requests.
    HttpRequestInitializer requestInitializer =
        request -> {
          new HttpCredentialsAdapter(credential).initialize(request);
          request.setConnectTimeout(60000); // 1 minute connect timeout
          request.setReadTimeout(60000); // 1 minute read timeout
        };

    // Build the client for interacting with the service.
    return new CloudHealthcare.Builder(HTTP_TRANSPORT, JSON_FACTORY, requestInitializer)
        .setApplicationName("your-application-name")
        .build();
  }

  private static String getAccessToken() throws IOException {
    GoogleCredentials credential =
        GoogleCredentials.getApplicationDefault()
            .createScoped(Collections.singleton(CloudHealthcareScopes.CLOUD_PLATFORM));

    return credential.refreshAccessToken().getTokenValue();
  }
}

Node.js

const {google} = require('googleapis');
const healthcare = google.healthcare('v1');

const searchFhirResourcesPost = async () => {
  const auth = await google.auth.getClient({
    scopes: ['https://www.googleapis.com/auth/cloud-platform'],
  });
  google.options({auth, method: 'POST'});

  // TODO(developer): uncomment these lines before running the sample
  // const cloudRegion = 'us-central1';
  // const projectId = 'adjective-noun-123';
  // const datasetId = 'my-dataset';
  // const fhirStoreId = 'my-fhir-store';
  // const resourceType = 'Patient';
  const parent = `projects/${projectId}/locations/${cloudRegion}/datasets/${datasetId}/fhirStores/${fhirStoreId}/fhir`;
  const request = {parent, resourceType};

  const response = await healthcare.projects.locations.datasets.fhirStores.fhir.search(
    request
  );
  const resources = response.data.entry;
  console.log(`Resources found: ${resources.length}`);
  console.log(JSON.stringify(resources, null, 2));
};

searchFhirResourcesPost();

Python

def search_resources_post(
    base_url, project_id, cloud_region, dataset_id, fhir_store_id
):
    """
    Searches resources in the given FHIR store.

    It 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.
    """
    url = "{}/projects/{}/locations/{}".format(base_url, project_id, cloud_region)

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

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

    # Make an authenticated API request
    session = get_session()

    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

검색어 구성하기

쿼리 문자열은 URL 형식으로 인코딩된 일련의 name=value 쌍입니다. 검색은 모든 쌍을 논리 AND로 조합합니다. 각 값은 쉼표로 구분된 값 목록일 수 있으며, 해당 값의 논리 OR로 취급됩니다. 예를 들면 다음과 같습니다.

Patient?key1=value1&key2=value2,value3

위 문자열은 다음 조건에 따라 Patient 리소스에 대해 검색을 수행합니다.

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

2개의 이름=값 쌍에 대해 OR을 수행하는 구문은 없습니다.

각 FHIR 리소스 유형은 FHIR의 각 버전에서 고유한 검색 매개변수를 정의합니다. 사용 가능한 매개변수는 각 리소스에 대한 FHIR 사양에 기술되어 있으며(예: FHIR R4 Patient), 기능 설명을 통해 프로그래매틱 방식으로 검색할 수 있습니다. Cloud Healthcare API는 대부분의 검색 매개변수를 지원합니다. 예외 사항은 기능 설명 또는 FHIR 적합성 명세를 통해 확인할 수 있습니다.

페이지로 나누기 및 정렬

검색 메서드에서 반환되는 최대 리소스 수는 _count 매개변수로 제어됩니다. 예를 들어 _count=10는 쿼리와 일치하는 리소스를 최대 10개 반환합니다. 기본값은 100이고 허용되는 최대값은 1000입니다.

검색으로 한 페이지에 들어가는 것보다 많은 리소스가 발견된 경우 응답의 Bundle.link 필드에 페이지로 나누기 URL이 포함됩니다. 이 필드에는 여러 값이 반환될 수 있습니다. Bundle.link.relation = next가 있는 값은 해당 Bundle.link.url을 사용해서 다음 페이지를 검색할 수 있음을 나타냅니다. Bundle.total 값은 일치하는 리소스의 총 수를 나타냅니다. 결과가 완전히 한 페이지 들어가면 이 값이 정확하지만, 결과 수가 한 페이지보다 큰 경우에는 값이 대략적입니다. 결과 수가 많을 때 이와 일치하는 검색의 정확한 합계는 결과가 끝까지 표시될 때까지 페이지 나누기 링크를 반복적으로 눌러야만 얻을 수 있습니다.

_sort 매개변수를 사용하여 결과를 정렬할 수 있습니다.이 매개변수는 우선 순위에 따라 쉼표로 구분된 검색 매개변수 목록을 허용하며, 내림차순으로 - 프리픽스를 지정합니다. 예를 들면 다음과 같습니다.

_sort=status,-date,category

상태 오름차순, 날짜 내림차순에 따른 동점차순, 카테고리 오름차순에 따른 나머지 동점차순에 따라 분류합니다.

색인 생성 지연

FHIR 리소스는 비동기적으로 색인이 생성되므로 리소스가 생성되거나 변경되는 시점과 변경사항이 검색결과에 반영되는 시점 사이에 약간의 지연이 있을 수 있습니다.

모든 리소스 유형에서 검색

_id와 같은 선행 밑줄로 구분되는 특정 검색 매개변수는 모든 리소스 유형에 적용됩니다. 이러한 모든 리소스 매개변수는 Resource 유형의 FHIR 사양에 나열됩니다.

이러한 검색 매개변수를 사용할 때 요청 경로에서 리소스 유형을 생략하여 여러 리소스 유형을 검색할 수 있습니다. 예를 들어 GET .../fhir/Patient?_id=1234 대신 GET .../fhir?_id=1234는 환자만 검색하는 것이 아니라 모든 리소스를 검색합니다. 특수 매개변수 _type를 이 요청 유형과 함께 사용하여 결과를 쉼표로 구분된 리소스 유형 목록으로 제한할 수 있습니다.

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

ObservationCondition 리소스에 대해 일치하는 결과만 반환합니다.

데이터 유형

FHIR로 정의된 각 검색 매개변수에는 문자열, 숫자, 날짜와 같은 기본 유형과 토큰, 참조, 수량과 같은 복잡한 유형이 포함됩니다. 각 데이터 유형에는 값을 지정하는 고유한 구문이 있으며 검색 수행 방식을 변경하는 수식어를 지원합니다.

다음은 간단한 데이터 유형 사용 예시입니다.

  • 숫자는 정수 또는 부동 소수점 값으로 검색합니다. 이 값은 ne, lt, le, gt, ge와 같은 한정자를 앞에 붙여서 비교 연산자를 바꿀 수 있습니다. 예를 들어 같으면 [parameter]=100으로 표시하고 100보다 크거나 같으면 [parameter]=ge100으로 표시합니다.
  • 날짜는 모든 날짜, 시간, 기간 유형으로 검색합니다. 날짜 매개변수 형식은 yyyy-mm-ddThh:mm:ss[Z|(+|-)hh:mm]이고, 숫자에 사용된 것과 동일한 프리픽스 한정자가 여기에도 적용됩니다.
  • 문자열은 기본적으로 대소 문자, 악센트 또는 기타 구별 부호에 영향을 주지 않는 프리픽스 검색으로 설정됩니다.
  • 토큰은 '코드'의 정확한 문자열 일치를 검색하며, 선택적으로 [parameter]=[system]|[code] 형식을 사용하여 코드를 가져오는 값을 나타내는 '시스템'의 URI로 범위가 지정됩니다. 예를 들어 code=http://hl7.org/fhir/ValueSet/observation-codes|10738-3는 지정된 URI이 있는 코딩 시스템의 값으로 정규화된 경우에만 10738-3 코드와 일치합니다.
  • 수량는 숫자와 동일한 접두사 수식어를 사용하여 숫자 값을 검색하며, 선택적으로 [parameter]=[prefix][number]|[system]|[code] 형식의 값 단위를 나타내는 특정 시스템과 코드로 검증됩니다. 예를 들어 value-quantity=lt9.1|http://unitsofmeasure.org|mg는 지정된 단위 체계 및 코드가 있는 9.1 미만의 수량 값을 검색합니다.
  • 참조는 리소스 간의 참조를 검색하는데 [parameter]=[id] 또는 [parameter]=[type]/[id]에 의해 FHIR 저장소 내의 리소스에 대한 참조를 검색하거나 [parameter]=[url]로 FHIR 저장소 외부에 있을 수 있는 URL에 대한 참조를 검색할 수 있습니다.

추가 데이터 유형, 값 구문, 수식어에 대한 자세한 내용은 고급 FHIR 검색 기능을 참조하세요.

검색 매개변수 처리

기본적으로 검색 메소드는 인식하지 않는 매개변수를 무시하고 요청에 남아있는 매개변수를 사용하여 검색을 수행하는 '관대한' 처리 방식을 적용하므로 예상보다 많은 리소스를 반환할 수 있습니다.

응답에는 Bundle.link.relation = self 값과 검색에 성공적으로 적용된 매개변수만 포함된 Bundle.link.url 값을 가진 Bundle.link의 값이 포함됩니다. 이 값을 검사하여 매개변수가 무시되었는지 여부를 확인할 수 있습니다.

또는 검색 요청에 HTTP 헤더 Prefer: handling=strict를 설정하면 FHIR 저장소가 인식할 수 없는 매개변수에 오류를 반환합니다.