

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Amazon OpenSearch Service의 데이터 검색
<a name="searching"></a>

URI 검색 및 요청 본문 검색을 포함하여 Amazon OpenSearch Service에서 문서를 검색하는 몇 가지 일반적인 방법이 있습니다. OpenSearch Service는 사용자 지정 패키지, SQL 지원 및 비동기 검색과 같은 검색 환경을 개선하는 추가 기능을 제공합니다. 포괄적인 OpenSearch 검색 API 참조는 [OpenSearch 설명서](https://docs.opensearch.org/latest/opensearch/query-dsl/full-text/)를 참조하세요.

**참고**  
다음 샘플 요청은 OpenSearch API에서 작동합니다. 일부 요청은 이전 버전의 Elasticsearch에서 작동하지 않을 수 있습니다.

**Topics**
+ [URI 검색](#searching-uri)
+ [요청 본문 검색](#searching-dsl)
+ [검색 결과 페이지 매김](#searching-paginating)
+ [Dashboards Query Language](#DashboardsQueryLanguages)
+ [Amazon OpenSearch Service에서 패키지 가져오기 및 관리](custom-packages.md)
+ [SQL을 사용하여 Amazon OpenSearch Service 데이터 쿼리](sql-support.md)
+ [Amazon OpenSearch Service의 교차 클러스터 검색](cross-cluster-search.md)
+ [Amazon OpenSearch Service용 순위 학습](learning-to-rank.md)
+ [Amazon OpenSearch Service의 비동기 검색](asynchronous-search.md)
+ [Amazon OpenSearch Service의 특정 시점 검색](pit.md)
+ [Amazon OpenSearch Service의 에이전트 검색](agentic-search.md)
+ [Amazon OpenSearch Service의 의미 검색](semantic-search.md)
+ [Amazon OpenSearch Service에서 동시 세그먼트 검색](concurrent-segment-search.md)
+ [Amazon OpenSearch Service의 자연어 쿼리 생성](natural-language-query.md)

## URI 검색
<a name="searching-uri"></a>

URI(Universal Resource Identifier) 검색은 가장 단순한 형태의 검색입니다. URI 검색에서는 쿼리를 HTTP 요청 파라미터로 지정합니다.

```
GET https://search-{{my-domain}}.{{us-west-1.}}es.amazonaws.com/_search?q=house
```

샘플 응답은 다음과 같습니다.

```
{
  "took": 25,
  "timed_out": false,
  "_shards": {
    "total": 10,
    "successful": 10,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 85,
      "relation": "eq",
    },
    "max_score": 6.6137657,
    "hits": [
      {
        "_index": "movies",
        "_type": "movie",
        "_id": "tt0077975",
        "_score": 6.6137657,
        "_source": {
          "directors": [
            "John Landis"
          ],
          "release_date": "1978-07-27T00:00:00Z",
          "rating": 7.5,
          "genres": [
            "Comedy",
            "Romance"
          ],
          "image_url": "http://ia.media-imdb.com/images/M/MV5BMTY2OTQxNTc1OF5BMl5BanBnXkFtZTYwNjA3NjI5._V1_SX400_.jpg",
          "plot": "At a 1962 College, Dean Vernon Wormer is determined to expel the entire Delta Tau Chi Fraternity, but those troublemakers have other plans for him.",
          "title": "Animal House",
          "rank": 527,
          "running_time_secs": 6540,
          "actors": [
            "John Belushi",
            "Karen Allen",
            "Tom Hulce"
          ],
          "year": 1978,
          "id": "tt0077975"
        }
      },
      {{...}}
    ]
  }
}
```

기본적으로 이 쿼리는 모든 색인의 모든 필드에서 검색어 *house*를 검색합니다. 검색 범위를 좁히려면 URI에서 색인(`movies`) 및 문서 필드(`title`)를 지정합니다.

```
GET https://search-{{my-domain}}.{{us-west-1.}}es.amazonaws.com/movies/_search?q=title:house
```

이 요청에 추가 파라미터를 포함할 수 있지만, 지원되는 파라미터는 OpenSearch 검색 옵션을 일부만 제공합니다. 다음 요청은 20개 결과(기본 개수 10개가 아님)를 반환하고 연도 기준으로 정렬합니다(`_score` 기준이 아님).

```
GET https://search-{{my-domain}}.{{us-west-1.}}es.amazonaws.com/movies/_search?q=title:house&size=20&sort=year:desc
```

## 요청 본문 검색
<a name="searching-dsl"></a>

더욱 복잡한 검색을 수행하려면 쿼리에 HTTP 요청 본문 및 OpenSearch DSL(Domain-Specific Language)을 사용합니다. 쿼리 DSL을 사용하면 전체 범위의 OpenSearch 검색 옵션을 지정할 수 있습니다.

**참고**  
텍스트 필드 값에 유니코드 특수 문자를 포함할 수 없습니다. 포함하면 값이 특수 문자로 구분된 여러 값으로 구문 분석됩니다. 이렇게 잘못된 구문 분석으로 인해 의도하지 않은 문서 필터링이 발생하여 문서 액세스에 대한 제어가 손상될 수 있습니다. 자세한 내용은 OpenSearch 설명서의 [텍스트 필드의 유니코드 특수 문자에 대한 참고 사항](https://opensearch.org/docs/latest/opensearch/query-dsl/index/#a-note-on-unicode-special-characters-in-text-fields)을 참조하세요.

다음 `match` 쿼리는 마지막 [URI 검색](#searching-uri) 예제와 유사합니다.

```
POST https://search-{{my-domain}}.{{us-west-1.}}es.amazonaws.com/movies/_search
{
  "size": 20,
  "sort": {
    "year": {
      "order": "desc"
    }
  },
  "query": {
    "query_string": {
      "default_field": "title",
      "query": "house"
    }
  }
}
```

**참고**  
`_search` API는 요청 본문 검색에 HTTP `GET` 및 `POST`를 허용하지만, 모든 HTTP 클라이언트가 `GET` 요청에 요청 본문을 추가하는 것을 지원하지는 않습니다. `POST`가 더욱 범용적 선택입니다.

많은 경우에 전체 필드는 아니지만 여러 필드를 검색해야 합니다. `multi_match` 쿼리를 사용합니다.

```
POST https://search-{{my-domain}}.{{us-west-1.}}es.amazonaws.com/movies/_search
{
  "size": 20,
  "query": {
    "multi_match": {
      "query": "house",
      "fields": ["title", "plot", "actors", "directors"]
    }
  }
}
```

### 필드 부스팅
<a name="searching-dsl-boost"></a>

특정 필드를 "부스팅"하여 검색 관련성을 개선할 수 있습니다. 부스트는 한 필드의 일치 항목을 다른 필드의 일치 항목보다 가중하는 배수입니다. 다음 예에서 `title` 필드의 *john*에 대한 일치 항목은 `plot` 필드의 일치 항목보다 두 배, `actors` 또는 `directors` 필드의 일치 항목보다 네 배 많이 `_score`에 영향을 미칩니다. 그러면 결과에서 *John Wick*, *John Carter* 같은 영화는 검색 결과의 거의 맨 위에 있고, John Travolta가 주인공인 영화는 거의 맨 아래에 있습니다.

```
POST https://search-{{my-domain}}.{{us-west-1.}}es.amazonaws.com/movies/_search
{
  "size": 20,
  "query": {
    "multi_match": {
      "query": "john",
      "fields": ["title^4", "plot^2", "actors", "directors"]
    }
  }
}
```

### 검색 결과 강조 표시
<a name="searching-dsl-highlighting"></a>

`highlight` 옵션은 쿼리가 하나 이상의 필드와 일치할 경우 `hits` 배열 내에 추가 객체를 반환하도록 OpenSearch에 지시합니다.

```
POST https://search-{{my-domain}}.{{us-west-1.}}es.amazonaws.com/movies/_search
{
  "size": 20,
  "query": {
    "multi_match": {
      "query": "house",
      "fields": ["title^4", "plot^2", "actors", "directors"]
    }
  },
  "highlight": {
    "fields": {
      "plot": {}
    }
  }
}
```

쿼리가 `plot`의 내용과 일치할 경우 히트는 다음과 같이 표시됩니다.

```
{
  "_index": "movies",
  "_type": "movie",
  "_id": "tt0091541",
  "_score": 11.276199,
  "_source": {
    "directors": [
      "Richard Benjamin"
    ],
    "release_date": "1986-03-26T00:00:00Z",
    "rating": 6,
    "genres": [
      "Comedy",
      "Music"
    ],
    "image_url": "http://ia.media-imdb.com/images/M/MV5BMTIzODEzODE2OF5BMl5BanBnXkFtZTcwNjQ3ODcyMQ@@._V1_SX400_.jpg",
    "plot": "A young couple struggles to repair a hopelessly dilapidated house.",
    "title": "The Money Pit",
    "rank": 4095,
    "running_time_secs": 5460,
    "actors": [
      "Tom Hanks",
      "Shelley Long",
      "Alexander Godunov"
    ],
    "year": 1986,
    "id": "tt0091541"
  },
  "highlight": {
    "plot": [
      "A young couple struggles to repair a hopelessly dilapidated <em>house</em>."
    ]
  }
}
```

기본적으로 OpenSearch는 일치 문자열을 `<em>` 태그로 묶고, 일치 항목 주위로 최대 100자의 컨텍스트를 제공하고, 마침표, 공백, 줄바꿈을 식별하여 내용을 분할합니다. 이러한 설정은 모두 사용자 지정이 가능합니다.

```
POST https://search-{{my-domain}}.{{us-west-1.}}es.amazonaws.com/movies/_search
{
  "size": 20,
  "query": {
    "multi_match": {
      "query": "house",
      "fields": ["title^4", "plot^2", "actors", "directors"]
    }
  },
  "highlight": {
    "fields": {
      "plot": {}
    },
    "pre_tags": "<strong>",
    "post_tags": "</strong>",
    "fragment_size": 200,
    "boundary_chars": ".,!? "
  }
}
```

### Count API
<a name="searching-dsl-count"></a>

문서 내용에는 관심이 없고 일치 항목 수만 알고 싶은 경우 `_search` API 대신 `_count` API를 사용할 수 있습니다. 다음 요청에서는 `query_string` 쿼리를 사용하여 로맨틱 코미디를 식별합니다.

```
POST https://search-{{my-domain}}.{{us-west-1.}}es.amazonaws.com/movies/_count
{
  "query": {
    "query_string": {
      "default_field": "genres",
      "query": "romance AND comedy"
    }
  }
}
```

샘플 응답은 다음과 같습니다.

```
{
  "count": 564,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  }
}
```

## 검색 결과 페이지 매김
<a name="searching-paginating"></a>

많은 수의 검색 결과를 표시해야 하는 경우 파라미터를 사용하여 페이지 매김을 구현할 수 있습니다.

### 특정 시점
<a name="pag-pit"></a>

PIT(특정 시점) 기능은 고정된 데이터 세트에 대해 다양한 쿼리를 실행할 수 있는 검색 유형입니다. 이는 OpenSearch에서 선호되는 페이지 매김 메서드이며, 특히 심층 페이지 매김의 경우 더욱 그렇습니다. PIT는 OpenSearch Service 버전 2.5 이상에서 사용할 수 있습니다. ACL에 대한 자세한 내용은 [Amazon OpenSearch Service의 특정 시점 검색](pit.md) 단원을 참조하세요.

### `from` 파라미터를 `size` 추가합니다.
<a name="pag-from-size"></a>

페이지를 매기는 가장 간단한 방법은 `from` 및 `size` 파라미터를 사용하는 것입니다. 다음 요청은 검색 결과의 0 기반 인덱스 목록에서 20\~39개 결과를 반환합니다.

```
POST https://search-{{my-domain}}.{{us-west-1.}}es.amazonaws.com/movies/_search
{
  "from": 20,
  "size": 20,
  "query": {
    "multi_match": {
      "query": "house",
      "fields": ["title^4", "plot^2", "actors", "directors"]
    }
  }
}
```

검색 페이지 매김에 대한 자세한 내용은 OpenSearch 설명서의 [결과 페이지 매김](https://opensearch.org/docs/latest/opensearch/search/paginate/)을 참조하세요.

## Dashboards Query Language
<a name="DashboardsQueryLanguages"></a>

[Dashboards Query Language(DQL)](https://opensearch.org/docs/latest/dashboards/dql/#terms-query)를 사용하여 OpenSearch Dashboards에서 데이터와 시각화를 검색할 수 있습니다. DQL은* *용어,* *부울,* *날짜 및 범위,* *중첩 필드의 4가지 기본 쿼리 유형을 사용합니다.

**용어 쿼리**

용어 쿼리를 사용하려면 검색하려는 용어를 지정해야 합니다.

용어 쿼리를 수행하려면 다음을 입력합니다.

```
host:www.example.com
```

**부울 쿼리**

부울 연산자 `AND`, `or` 및 `not`을 사용하여 여러 쿼리를 결합할 수 있습니다.

부울 쿼리를 수행하려면 다음을 붙여 넣습니다.

```
host.keyword:www.example.com and response.keyword:200
```

**날짜 및 범위 쿼리**

날짜 및 범위 쿼리를 사용하여 쿼리 전후의 날짜를 찾을 수 있습니다.
+ `>`는 지정한 날짜 후의 날짜 검색을 나타냅니다.
+ `<`는 지정한 날짜 전의 날짜 검색을 나타냅니다.

`@timestamp > "2020-12-14T09:35:33"`

**중첩 필드 쿼리**

문서에 중첩 필드가 있는 경우 검색할 문서 부분을 지정해야 합니다. 다음은 중첩 필드가 있는 샘플 문서입니다.

```
{"NBA players":[
    {"player-name": "Lebron James",
      "player-position": "Power forward",
      "points-per-game": "30.3"
    },
    {"player-name": "Kevin Durant",
      "player-position": "Power forward",
      "points-per-game": "27.1"
    },
    {"player-name": "Anthony Davis",
      "player-position": "Power forward",
      "points-per-game": "23.2"
    },
    {"player-name": "Giannis Antetokounmpo",
      "player-position": "Power forward",
      "points-per-game":"29.9"
    }
  ]
}
```

DQL을 사용하여 특정 필드를 검색하려면 다음을 붙여 넣습니다.

```
NBA players: {player-name: Lebron James}
```

중첩 문서에서 여러 객체를 검색하려면 다음을 붙여 넣습니다.

```
NBA players: {player-name: Lebron James} and NBA players: {player-name: Giannis Antetokounmpo}
```

범위 내에서 검색하려면 다음을 붙여 넣습니다.

```
NBA players: {player-name: Lebron James} and NBA players: {player-name: Giannis Antetokounmpo and < 30}
```

문서에 다른 객체 내에 중첩된 객체가 있는 경우에도 모든 수준을 지정하여 데이터를 검색할 수 있습니다. 이렇게 하려면 다음을 붙여 넣습니다.

```
Top-Power-forwards.NBA players: {player-name:Lebron James}
```