

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

# Amazon OpenSearch Service에서 k-Nearest Neighbor(k-NN) 검색
<a name="knn"></a>

관련 *k-nearest neighbors* 알고리즘의 약자인 Amazon OpenSearch Service용 k-NN을 사용하면 벡터 공간에서 포인트를 검색하고 해당 포인트에 대한 “가장 가까운 아웃”을 Euclidean 거리 또는 코사인 유사도로 찾을 수 있습니다. 사용 사례에는 권장 사항(예: 음악 애플리케이션의 “좋아하는 다른 노래” 기능), 이미지 인식 및 사기 탐지가 포함됩니다.

**참고**  
이 설명서에서는 k-NN 플러그인에 대한 간략한 개요와 관리형 OpenSearch Service에서 플러그인을 사용할 때의 제한 사항을 설명합니다. 간단하고 복잡한 예, 파라미터 참조 및 전체 API 참조를 포함하여 k-NN 플러그인에 대한 포괄적인 설명서는 오픈 소스 [OpenSearch 설명서](https://opensearch.org/docs/latest/search-plugins/knn/index/)를 참조하세요. 오픈 소스 설명서에서는 성능 조정 및 k-NN별 클러스터 설정도 다룹니다.

## k-NN 시작하기
<a name="knn-gs"></a>

k-NN을 사용하려면 `index.knn` 설정으로 인덱스를 만들고 `knn_vector` 데이터 유형의 필드를 하나 이상 추가해야 합니다.

```
PUT my-index

{
  "settings": {
    "index.knn": true
  },
  "mappings": {
    "properties": {
      "{{my_vector1}}": {
        "type": "knn_vector",
        "dimension": 2
      },
      "{{my_vector2}}": {
        "type": "knn_vector",
        "dimension": 4
      }
    }
  }
}
```

`knn_vector` 데이터 유형은 필수 `dimension` 파라미터로 정의된 부동 소수점 수를 사용하여 최대 10,000개의 부동 소수점으로 구성된 단일 목록을 지원합니다. 인덱스를 생성한 후 일부 데이터를 추가합니다.

```
POST _bulk

{ "index": { "_index": "my-index", "_id": "1" } }
{ "my_vector1": [1.5, 2.5], "price": 12.2 }
{ "index": { "_index": "my-index", "_id": "2" } }
{ "my_vector1": [2.5, 3.5], "price": 7.1 }
{ "index": { "_index": "my-index", "_id": "3" } }
{ "my_vector1": [3.5, 4.5], "price": 12.9 }
{ "index": { "_index": "my-index", "_id": "4" } }
{ "my_vector1": [5.5, 6.5], "price": 1.2 }
{ "index": { "_index": "my-index", "_id": "5" } }
{ "my_vector1": [4.5, 5.5], "price": 3.7 }
{ "index": { "_index": "my-index", "_id": "6" } }
{ "my_vector2": [1.5, 5.5, 4.5, 6.4], "price": 10.3 }
{ "index": { "_index": "my-index", "_id": "7" } }
{ "my_vector2": [2.5, 3.5, 5.6, 6.7], "price": 5.5 }
{ "index": { "_index": "my-index", "_id": "8" } }
{ "my_vector2": [4.5, 5.5, 6.7, 3.7], "price": 4.4 }
{ "index": { "_index": "my-index", "_id": "9" } }
{ "my_vector2": [1.5, 5.5, 4.5, 6.4], "price": 8.9 }
```

그런 다음 `knn` 쿼리 유형을 사용하여 데이터를 검색할 수 있습니다.

```
GET my-index/_search
{
  "size": 2,
  "query": {
    "knn": {
      "{{my_vector2}}": {
        "vector": [2, 3, 5, 6],
        "k": 2
      }
    }
  }
}
```

이 경우 `k`는 쿼리를 반환하려는 이웃 수입니다. 하지만 `size` 옵션도 포함해야 합니다. 그렇지 않으면 전체 쿼리에 대한 `k` 결과가 아닌 각 샤드(및 각 세그먼트)에 대한 `k` 결과를 얻습니다. k-NN은 최대 `k` 값인 10,000을 지원합니다.

`knn` 쿼리를 다른 절과 혼합하면 `k` 결과보다 적게 수신할 수 있습니다. 이 예제에서 `post_filter` 절은 결과 수를 2에서 1로 줄입니다.

```
GET my-index/_search

{
  "size": 2,
  "query": {
    "knn": {
      "{{my_vector2}}": {
        "vector": [2, 3, 5, 6],
        "k": 2
      }
    }
  },
  "post_filter": {
    "range": {
      "{{price}}": {
        "gte": 6,
        "lte": 10
      }
    }
  }
}
```

최적의 성능을 유지하면서 대량의 쿼리를 처리해야 하는 경우 [https://opensearch.org/docs/latest/api-reference/multi-search/](https://opensearch.org/docs/latest/api-reference/multi-search/) API를 사용하여 JSON으로 대량 검색을 구성하고 단일 요청을 전송하여 여러 검색을 수행할 수 있습니다.

```
GET _msearch

{ "index": "my-index"}
{ "query": { "knn": {"my_vector2":{"vector": [2, 3, 5, 6],"k":2 }} } }
{ "index": "my-index", "search_type": "dfs_query_then_fetch"}
{ "query": { "knn": {"my_vector1":{"vector": [2, 3],"k":2 }} } }
```

다음 동영상은 K-NN 쿼리에 대한 대량 벡터 검색을 설정하는 방법을 보여줍니다.

[![AWS Videos](http://img.youtube.com/vi/Umi67JCfCbU/0.jpg)](http://www.youtube.com/watch?v=Umi67JCfCbU)


## k-NN의 차이점, 조정, 제한 사항
<a name="knn-settings"></a>

OpenSearch를 사용하면 `_cluster/settings` API를 사용해 모든 [k-NN 설정](https://docs.opensearch.org/latest/vector-search/settings/)을 수정합니다. OpenSearch Service에서는 `knn.memory.circuit_breaker.enabled` 및 `knn.circuit_breaker.triggered`를 제외한 모든 설정을 변경할 수 있습니다. k-NN 통계량은 [Amazon CloudWatch 지표](managedomains-cloudwatchmetrics.md)로 포함됩니다.

특히, 각 데이터 노드의 `KNNGraphMemoryUsage` 지표를 `knn.memory.circuit_breaker.limit` 통계 및 해당 인스턴스 유형에 사용 가능한 RAM과 비교해 확인합니다. OpenSearch Service는 Java 힙에 인스턴스 RAM의 절반을 사용합니다(최대 힙 크기 32GiB). 기본적으로 k-NN은 나머지 절반의 최대 50%를 사용하므로 RAM이 32GiB인 인스턴스 유형에서는 그래프 8GiB(32 \* 0.5 \* 0.5)를 수용할 수 있습니다. 그래프 메모리 사용량이 이 값을 초과하면 성능이 저하될 수 있습니다.

버전 2.x 이상에서 생성된 k-NN 인덱스를 버전 2.17 이상 도메인의 [UltraWarm](ultrawarm.md) 또는 [콜드 스토리지](cold-storage.md)로 마이그레이션할 수 있습니다.

k-NN 인덱스에 대한 캐시 지우기 API 및 워밍업 API는 웜 인덱스에 대해 차단됩니다. 인덱스에 대해 첫 번째 쿼리가 시작되면 Amazon S3가 그래프 파일을 다운로드하고 그래프를 메모리에 로드합니다. 마찬가지로, 그래프의 TTL이 만료되면 파일이 메모리에서 자동으로 제거됩니다.