

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

# 벡터 검색
<a name="vector-search"></a>

MemoryDB에 대한 벡터 검색은 MemoryDB의 기능을 확장합니다. 벡터 검색은 기존 MemoryDB 기능과 함께 사용할 수 있습니다. 벡터 검색을 사용하지 않는 애플리케이션은 벡터 검색의 존재 여부에 영향을 받지 않습니다. MemoryDB를 사용할 수 있는 모든 리전에서 벡터 검색을 사용할 수 있습니다.

벡터 검색은 고속 벡터 검색을 제공하는 동시에 애플리케이션 아키텍처를 간소화합니다. MemoryDB의 벡터 검색은 최대 성능과 규모가 가장 중요한 선택 기준인 사용 사례에 적합합니다. 기존 MemoryDB 데이터나 Valkey 또는 Redis OSS API를 사용하여 기계 학습 및 생성형 AI 사용 사례를 구축할 수 있습니다. 여기에는 검색 증강 생성, 이상 탐지, 문서 검색, 실시간 권장 사항이 포함됩니다.

6/26/2024부터 AWS MemoryDB는 널리 사용되는 벡터 데이터베이스 중에서 가장 빠른 벡터 검색 성능을 가장 높은 재현율로 제공합니다 AWS.

**Topics**
+ [벡터 검색 개요](vector-search-overview.md)
+ [사용 사례](vector-search-examples.md)
+ [벡터 검색 기능 및 제한](vector-search-limits.md)
+ [벡터 검색이 가능한 클러스터 생성](vector-search-cluster.md)
+ [벡터 검색 명령](vector-search-commands.md)

# 벡터 검색 개요
<a name="vector-search-overview"></a>

벡터 검색은 인덱스 생성, 유지 관리 및 사용을 기반으로 합니다. 각 벡터 검색 작업은 단일 인덱스를 지정하며 해당 인덱스로만 제한됩니다. 즉, 한 인덱스에 대한 작업은 다른 인덱스에 대한 작업의 영향을 받지 않습니다. 인덱스 생성 및 삭제 작업을 제외하고 언제든지 모든 인덱스에 대해 원하는 수의 작업을 실행할 수 있습니다. 즉, 클러스터 수준에서는 여러 인덱스에 대한 여러 작업이 동시에 진행될 수 있습니다.

개별 인덱스는 키, 함수 등 다른 Valkey 및 Redis OSS 네임스페이스와는 별개인 고유한 네임스페이스에 존재하는 명명된 객체입니다. 각 인덱스는 열과 행이라는 두 가지 차원으로 구성된다는 점에서 기존 데이터베이스 테이블과 개념적으로 유사합니다. 테이블의 각 행은 키에 해당합니다. 인덱스의 각 열은 해당 키의 멤버 또는 일부에 해당합니다. 이 문서 내에서 키, 행 및 레코드라는 용어는 동일한 의미로 통용됩니다. 마찬가지로 열, 필드, 경로 및 멤버라는 용어는 본질적으로 동일한 의미로 통용됩니다.

인덱싱된 데이터를 추가, 삭제 또는 수정하기 위한 특별한 명령은 없습니다. 대신 인덱스에 있는 키를 수정하는 기존 **HASH** 또는 **JSON** 명령도 인덱스를 자동으로 업데이트합니다.

**Topics**
+ [인덱스와 Valkey 및 Redis OSS 키스페이스](#vector-search-indexes-keyspaces)
+ [인덱스 필드 유형](#vector-search-index-field-types)
+ [벡터 인덱스 알고리즘](#vector-search-index-algorithms)
+ [벡터 검색 쿼리 표현식](#vector-search-query-expression)
+ [INFO 명령](#vector-search-ft.info)
+ [벡터 검색 보안](#vector-search-security)

## 인덱스와 Valkey 및 Redis OSS 키스페이스
<a name="vector-search-indexes-keyspaces"></a>

인덱스는 Valkey 및 Redis OSS 키스페이스의 하위 집합을 기준으로 구성되고 유지 관리됩니다. 여러 인덱스는 키스페이스의 분리되거나 중복되는 하위 집합을 제한 없이 선택할 수 있습니다. 각 인덱스의 키스페이스는 인덱스 생성 시 제공되는 키 접두사 목록에 의해 정의됩니다. 접두사 목록은 선택 사항이며 생략하면 전체 키스페이스가 해당 인덱스에 포함됩니다. 또한 인덱스는 유형이 일치하는 키만 포함하도록 입력됩니다. 현재는 JSON 및 HASH 인덱스만 지원됩니다. HASH 인덱스는 접두사 목록에 포함된 HASH 키만 인덱싱하고, 마찬가지로 JSON 인덱스는 접두사 목록에 포함된 JSON 키만 인덱싱합니다. 인덱스의 키스페이스 접두사 목록 내에서 지정된 유형이 없는 키는 무시되며 검색 작업에 영향을 주지 않습니다.

HASH 또는 JSON 명령으로 인덱스의 키스페이스 내에 있는 키를 수정하면 해당 인덱스가 업데이트됩니다. 이 프로세스에는 각 인덱스에 대해 선언된 필드를 추출하고 새 값으로 인덱스를 업데이트하는 작업이 포함됩니다. 업데이트 프로세스는 백그라운드 스레드에서 수행되므로 인덱스가 최종적으로 해당 키스페이스 콘텐츠와 일치해야 합니다. 따라서 키를 삽입하거나 업데이트해도 당장은 검색 결과에 표시되지 않습니다. 시스템 부하가 심하거나 데이터가 심하게 변경되는 기간에는 가시성 지연이 더 길어질 수 있습니다.

인덱스 생성은 다단계 프로세스입니다. 첫 번째 단계는 인덱스를 정의하는 [FT.CREATE](https://docs.aws.amazon.com/memorydb/latest/devguide/vector-search-commands-ft.create.html) 명령을 실행하는 것입니다. 생성을 성공적으로 실행하면 두 번째 단계인 채우기가 자동으로 시작됩니다. 채우기 프로세스는 백그라운드 스레드에서 실행되며 키스페이스를 스캔하여 새 인덱스의 접두사 목록 내에 있는 키를 찾습니다. 발견된 각 키는 인덱스에 추가됩니다. 결국 전체 키스페이스가 스캔되어 인덱스 생성 프로세스가 완료됩니다. 채우기 프로세스가 실행되는 동안에는 제한 없이 인덱스 키를 변경할 수 있으며 모든 키가 제대로 인덱싱될 때까지 인덱스 채우기 프로세스가 완료되지 않습니다. 인덱스를 채우는 동안 시도한 쿼리 작업은 허용되지 않으며 오류가 발생하여 종료됩니다. 채우기 프로세스의 완료 여부는 해당 인덱스에 대한 `FT.INFO` 명령 출력('backfill\$1status')에서 확인할 수 있습니다.

## 인덱스 필드 유형
<a name="vector-search-index-field-types"></a>

인덱스의 각 필드(열)에는 인덱스 생성 시 선언되는 특정 유형 및 키 내의 위치가 표시됩니다. HASH 키의 경우 위치는 HASH 내의 필드 이름입니다. JSON 키의 경우 위치는 JSON 경로 설명입니다. 키가 수정되면 선언된 필드와 관련된 데이터가 추출되고 선언된 유형으로 변환되어 인덱스에 저장됩니다. 데이터가 누락되었거나 선언된 유형으로 성공적으로 변환할 수 없는 경우 해당 필드는 인덱스에서 제외됩니다. 필드에는 다음 설명과 같이 네 가지 유형이 있습니다.
+ **숫자 필드**에는 단일 숫자가 포함됩니다. JSON 필드의 경우 JSON 번호의 숫자 규칙을 따라야 합니다. HASH의 경우 필드에 고정 또는 부동 소수점 숫자의 표준 형식으로 작성된 ASCII 텍스트가 포함되어야 합니다. 키 내 표시 형식에 관계없이 이 필드는 64비트 부동 소수점 숫자로 변환되어 인덱스 내에 저장됩니다. 숫자 필드는 범위 검색 연산자와 함께 사용할 수 있습니다. 기본 숫자는 정밀도 제한에 따라 부동 소수점으로 저장되므로 부동 소수점 숫자 비교에 대한 일반적인 규칙이 적용됩니다.
+ **태그 필드**에는 단일 UTF-8 문자열로 코딩된 0개 이상의 태그 값이 포함됩니다. 문자열은 선행 및 후행 공백이 제거된 구분 문자(기본값은 쉼표이지만 재정의할 수 있음)를 사용하여 태그 값으로 구문 분석됩니다. 단일 태그 필드에 원하는 수의 태그 값을 포함할 수 있습니다. 태그 필드를 사용하여 대소문자를 구분하거나 구분하지 않는 비교를 통해 태그 값이 동일한 쿼리를 필터링할 수 있습니다.
+ **텍스트 필드**에는 UTF-8 규격을 준수하지 않아도 되는 수많은 바이트가 포함됩니다. 텍스트 필드를 사용하여 쿼리 결과를 애플리케이션에 적합한 값으로 장식할 수 있습니다. 예를 들어 URL이나 문서 내용 등이 가능합니다.
+ **벡터 필드**에는 임베딩이라고도 하는 숫자 벡터가 포함됩니다. 벡터 필드는 지정된 알고리즘과 거리 측정법을 사용하여 크기가 고정된 벡터의 K-nearest neighbor(KNN) 검색을 지원합니다. HASH 인덱스의 경우 필드에 바이너리 형식(*리틀 엔디안 IEEE 754*)으로 인코딩된 전체 벡터가 포함되어야 합니다. JSON 키의 경우 경로는 숫자로 채워진 올바른 크기의 배열을 참조해야 합니다. JSON 배열을 벡터 필드로 사용하는 경우 JSON 키 내 배열의 내부 표현이 선택한 알고리즘에서 요구하는 형식으로 변환되므로 메모리 사용량과 정밀도가 줄어듭니다. 이후에 JSON 명령을 사용하여 읽기 작업을 수행하면 낮아진 정밀도 값을 출력합니다.

## 벡터 인덱스 알고리즘
<a name="vector-search-index-algorithms"></a>

다음과 같은 두 개의 벡터 인덱스 알고리즘이 제공됩니다.
+ **FLAT** - FLAT 알고리즘은 인덱스의 각 벡터를 무차별 대입으로 선형 처리하여 거리 계산의 정밀도 범위 내에서 정확한 답을 산출합니다. 인덱스의 선형 처리로 인해 큰 인덱스의 경우 이 알고리즘의 실행 시간이 매우 길어질 수 있습니다.
+ **Hierarchical Navigable Small Worlds(HSSW)** - HNSW 알고리즘은 실행 시간을 크게 줄이는 대신 정답의 근사치를 제공합니다. 알고리즘은 세 개의 파라미터 `M`, `EF_CONSTRUCTION`, `EF_RUNTIME`에 의해 제어됩니다. 처음 두 파라미터는 인덱스 생성 시 지정되며 변경할 수 없습니다. 이 `EF_RUNTIME` 파라미터는 인덱스 생성 시 지정되는 기본값을 갖지만 이후에 개별 쿼리 작업에서 재정의할 수 있습니다. 이 세 파라미터는 상호 작용하여 수집 및 쿼리 작업 중에 메모리와 CPU 사용량의 균형을 맞추고 정확한 KNN 검색의 근사치 품질(재현율)을 제어합니다.

벡터 검색 알고리즘(FLAT 및 HNSW) 모두 선택적 `INITIAL_CAP` 파라미터를 지원합니다. 이 파라미터를 지정하면 인덱스에 메모리를 사전 할당하여 메모리 관리 오버헤드를 줄이고 벡터 수집 비율을 높입니다.

HNSW와 같은 벡터 검색 알고리즘은 이전에 삽입한 벡터의 삭제 또는 덮어쓰기를 효율적으로 처리하지 못할 수 있습니다. 이러한 연산을 사용하면 인덱스 메모리가 과도하게 소모되거나 재현율이 저하될 수 있습니다. 인덱스를 다시 지정하는 것은 최적의 메모리 사용량 또는 재현율을 복원하기 위한 방법 중 하나입니다.

## 벡터 검색 쿼리 표현식
<a name="vector-search-query-expression"></a>

[FT.SEARCH](https://docs.aws.amazon.com/memorydb/latest/devguide/vector-search-commands-ft.search.html) 및 [FT.AGGREGATE](https://docs.aws.amazon.com/memorydb/latest/devguide/vector-search-commands-ft.aggregate.html) 명령에는 쿼리 표현식이 필요합니다. 이 표현식은 하나 이상의 연산자로 구성된 단일 문자열 파라미터입니다. 각 연산자는 인덱스의 한 필드를 사용하여 인덱스에 있는 키의 하위 집합을 식별합니다. 부울 컴바이너와 괄호로 여러 연산자를 결합하여 수집된 키 세트(또는 결과 집합)를 더욱 향상시키거나 제한할 수 있습니다.

### 와일드카드
<a name="vector-search-query-expression-wildcard"></a>

와일드카드 연산자인 별표('\$1')는 인덱스의 모든 키와 일치합니다.

### 숫자 범위
<a name="vector-search-query-expression-numeric-range"></a>

숫자 범위 연산자의 구문은 다음과 같습니다.

```
<range-search> ::= '@' <numeric-field-name> ':' '[' <bound> <bound> ']'
<bound>  ::= <number> | '(' <number>
<number> ::= <integer> | <fixed-point> | <floating-point> | 'Inf' | '-Inf' | '+Inf'
```

<numeric-field-name>은 `NUMERIC` 유형의 선언된 필드여야 합니다. 기본적으로 경계값도 검색 범위에 포함되지만 앞에 여는 괄호['(']를 사용하여 경계값이 검색 범위에서 제외되도록 만들 수 있습니다. 범위 검색은 `Inf`, `+Inf` 또는 `-Inf`를 경계값으로 사용하여 단일 관계형 비교(<, <=, >, >=)로 변환될 수 있습니다. 지정된 숫자 형식(정수, 고정 소수점, 부동 소수점, 무한대)에 관계없이 숫자를 64비트 부동 소수점으로 변환하여 비교를 수행하므로 정밀도가 낮아집니다.

**Example 예제**  

```
@numeric-field:[0 10]                      // 0   <= <value> <= 10
@numeric-field:[(0 10]                     // 0   <  <value> <= 10
@numeric-field:[0 (10]                     // 0   <= <value> <  10
@numeric-field:[(0 (10]                    // 0   <  <value> <  10
@numeric-field:[1.5 (Inf]                  // 1.5 <= value
```

### 태그 비교
<a name="vector-search-query-expression-tag-compare"></a>

태그 비교 연산자의 구문은 다음과 같습니다.

```
<tag-search> ::= '@' <tag-field-name> ':' '{' <tag> [ '|' <tag> ]* '}'
```

연산자의 태그 중 하나라도 레코드 태그 필드에 있는 태그와 일치하는 경우 해당 레코드가 결과 집합에 포함됩니다. `<tag-field-name>`에서 디자인하는 필드는 `TAG` 유형으로 선언된 인덱스의 필드여야 합니다. 태그 비교의 예는 다음과 같습니다.

```
@tag-field:{ atag }
@tag-field: { tag1 | tag2 }
```

### 부울 조합
<a name="vector-search-query-expression-boolean-combinations"></a>

부울 논리 and/or를 사용하여 숫자 연산자 또는 태그 연산자의 결과 집합을 결합할 수 있습니다. 괄호를 사용하여 연산자를 그룹화하거나 평가 순서를 변경할 수 있습니다. 부울 논리 연산자의 구문은 다음과 같습니다.

```
<expression> ::= <phrase> | <phrase> '|' <expression> | '(' <expression> ')'
<phrase> ::= <term> | <term> <phrase>
<term> ::= <range-search> | <tag-search> | '*'
```

여러 용어가 하나의 구문으로 결합될 때 ‘and’ 연산이 수행됩니다. 여러 구문이 파이프(‘\$1’)로 결합될 때 'or' 연산이 수행됩니다.

### 벡터 검색
<a name="vector-search-query-expression-vector-search"></a>

벡터 인덱스는 가장 가까운 이웃과 범위의 두 가지 검색 방법을 지원합니다. 가장 가까운 이웃 검색은 인덱스에서 제공된 (참조) 벡터에 가장 가까운 벡터의 숫자 K를 찾습니다. 이를 ‘K’개의 가장 가까운 이웃을 의미하는 KNN이라고 합니다. KNN 검색의 구문은 다음과 같습니다.

```
<vector-knn-search> ::= <expression> '=>[KNN' <k> '@' <vector-field-name> '$' <parameter-name> <modifiers> ']'
<modifiers> ::= [ 'EF_RUNTIME' <integer> ] [ 'AS' <distance-field-name>]
```

벡터 KNN 검색은 와일드카드, 범위 검색, 태그 검색 및/또는 이들 연산자의 부울 조합 등 위에서 정의된 연산자의 조합인 `<expression>`을 만족하는 벡터에만 적용됩니다.
+ `<k>`는 반환되는 가장 가까운 이웃 벡터의 수를 지정하는 정수입니다.
+ `<vector-field-name>`은 선언된 `VECTOR` 유형의 필드를 지정해야 합니다.
+ `<parameter-name>` 필드는 `FT.SEARCH` 또는 `FT.AGGREGATE` 명령의 `PARAM` 테이블 항목 중 하나를 지정합니다. 이 파라미터는 거리 계산을 위한 참조 벡터 값입니다. 벡터 값은 *리틀 엔디안 IEEE 754* 바이너리 형식의 `PARAM` 값으로 인코딩됨(HASH 벡터 필드와 동일하게 인코딩됨)
+ HNSW 유형의 벡터 인덱스의 경우 선택적 `EF_RUNTIME`절을 사용하여 인덱스 생성 시 설정된 `EF_RUNTIME` 파라미터의 기본값을 재정의할 수 있습니다.
+ 선택적 `<distance-field-name>`은 결과 집합에 참조 벡터와 찾은 키 사이의 계산된 거리를 포함하는 필드 이름을 제공합니다.

범위 검색은 참조 벡터에서 지정된 거리(반경) 내에 있는 모든 벡터를 찾습니다. 범위 검색의 구문은 다음과 같습니다.

```
<vector-range-search> ::= ‘@’ <vector-field-name> ‘:’ ‘[’ ‘VECTOR_RANGE’ ( <radius> | ‘$’ <radius-parameter> )  $<reference-vector-parameter> ‘]’ [ ‘=’ ‘>’ ‘{’ <modifiers> ‘}’ ] 
<modifiers> ::= <modifier> | <modifiers>, <modifier> 
<modifer> ::= [ ‘$yield_distance_as’ ‘:’ <distance-field-name> ] [ ‘$epsilon’ ‘:’ <epsilon-value> ]
```

위치:
+ `<vector-field-name>`은 검색할 벡터 필드의 이름입니다.
+ `<radius> or $<radius-parameter>`는 검색의 숫자 거리 제한입니다.
+ `$<reference-vector-parameter> `는 참조 벡터가 포함된 파라미터의 이름입니다. 벡터 값은 리틀 엔디안 IEEE 754 바이너리 형식의 PARAM 값으로 인코딩됩니다(HASH 벡터 필드와 동일하게 인코딩됨).
+ 선택적 `<distance-field-name>`은 결과 집합에 참조 벡터와 각 키 사이의 계산된 거리를 포함하는 필드 이름을 제공합니다.
+ 선택적 `<epsilon-value> `는 검색 작업의 경계를 제어합니다. `<radius> * (1.0 + <epsilon-value>) ` 거리 내의 벡터는 후보 결과를 찾기 위해 순회합니다. 기본값은 0.01입니다.

## INFO 명령
<a name="vector-search-ft.info"></a>

벡터 검색은 통계 및 카운터의 여러 추가 섹션으로 Valkey 및 Redis OSS [INFO](https://valkey.io/commands/info/) 명령을 보강합니다. `SEARCH` 섹션 검색을 요청하면 다음 섹션이 모두 검색됩니다.

### `search_memory` 섹션
<a name="vector-search-ft.info-search-memory"></a>


| 이름 | 설명 | 
| --- | --- | 
| search\$1used\$1memory\$1bytes | 모든 검색 데이터 구조에서 사용된 메모리 바이트 수 | 
| search\$1used\$1memory\$1human | 사람이 읽을 수 있는 위의 버전 | 

### `search_index_stats` 섹션
<a name="vector-search-ft.info-search_index_stats"></a>


| 이름 | 설명 | 
| --- | --- | 
| search\$1number\$1of\$1indexes | 생성된 인덱스 수 | 
| search\$1num\$1fulltext\$1indexes | 모든 인덱스의 벡터가 아닌 필드 수 | 
| search\$1num\$1vector\$1indexes | 모든 인덱스 내 벡터 필드 수 | 
| search\$1num\$1hash\$1indexes | HASH 유형 키의 인덱스 수 | 
| search\$1num\$1json\$1indexes | JSON 유형 키의 인덱스 수 | 
| search\$1total\$1indexed\$1keys | 모든 인덱스의 총 키 수 | 
| search\$1total\$1indexed\$1vectors | 모든 인덱스의 총 벡터 수 | 
| search\$1total\$1indexed\$1hash\$1keys | 모든 인덱스의 HASH 유형 총 키 수 | 
| search\$1total\$1indexed\$1json\$1keys | 모든 인덱스의 JASON 유형 총 키 수 | 
| search\$1total\$1index\$1size | 모든 인덱스에서 사용하는 바이트 | 
| search\$1total\$1fulltext\$1index\$1size | 벡터가 아닌 인덱스 구조에서 사용되는 바이트 | 
| search\$1total\$1vector\$1index\$1size | 벡터 인덱스 구조에서 사용되는 바이트 | 
| search\$1max\$1index\$1lag\$1ms | 마지막 수집 배치 업데이트 동안의 수집 지연 | 

### `search_ingestion` 섹션
<a name="vector-search-ft.info-search_ingestion"></a>


| 이름 | 설명 | 
| --- | --- | 
| search\$1background\$1indexing\$1status | 수집 상태 NO\$1ACTIVITY는 유휴 상태를 의미합니다. 다른 값은 키가 수집 중인 키가 있음을 나타냅니다. | 
| search\$1ingestion\$1paused | 다시 시작하는 경우를 제외하고는 항상 ‘no’여야 합니다. | 

### `search_backfill` 섹션
<a name="vector-search-ft.info-search_backfill"></a>

**참고**  
이 섹션에 설명된 일부 필드는 채우기가 진행 중일 때만 표시됩니다.


| 이름 | 설명 | 
| --- | --- | 
| search\$1num\$1active\$1backfills | 현재 채우기 활동 수 | 
| search\$1backfills\$1paused | 메모리가 부족한 경우를 제외하고는 항상 ‘no’여야 합니다. | 
| search\$1current\$1backfill\$1progress\$1percentage | 현재 채우기 완료율(0\$1100) | 

### `search_query` 섹션
<a name="vector-search-ft.info-search_query"></a>


| 이름 | 설명 | 
| --- | --- | 
| search\$1num\$1active\$1queries | 현재 진행 중인 FT.SEARCH 명령 및 FT.AGGREGATE 명령 수 | 

## 벡터 검색 보안
<a name="vector-search-security"></a>

명령 및 데이터 액세스 모두에 대한 [액세스 제어 목록(ACL)](https://valkey.io/topics/acl/) 보안 메커니즘이 검색 기능을 제어하도록 확장되었습니다. 개별 검색 명령의 ACL 제어가 완벽하게 지원됩니다. 새 ACL 범주 `@search`가 추가되었으며 많은 기존 범주(`@fast`, `@read`, `@write` 등)가 새 명령을 포함하도록 업데이트되었습니다. 검색 명령은 키 데이터를 수정하지 않습니다. 즉, 쓰기 액세스를 위한 기존 ACL 시스템이 보존됩니다. HASH 및 JSON 작업에 대한 액세스 규칙은 인덱스가 있더라도 수정되지 않습니다. 이러한 명령에는 여전히 일반적인 키 수준 액세스 제어가 적용됩니다.

인덱스가 있는 검색 명령의 액세스도 ACL로 제어됩니다. 액세스 확인은 키별 수준이 아닌 전체 인덱스 수준에서 수행됩니다. 즉, 사용자가 해당 인덱스의 키스페이스 접두사 목록 내에서 가능한 모든 키에 액세스할 수 있는 권한을 가진 경우에만 사용자에게 인덱스 액세스 권한이 부여됩니다. 즉, 인덱스의 실제 콘텐츠는 액세스를 제어하지 않습니다. 그보다는 접두사 목록에 정의된 인덱스의 이론상 내용이 보안 검사에 사용됩니다. 사용자에게 키에 대한 읽기 및/또는 쓰기 액세스는 있지만 해당 키가 포함된 인덱스에는 액세스할 수 없는 상황이 발생하기 쉽습니다. 인덱스를 만들거나 사용할 때는 키스페이스에 대한 읽기 액세스만 필요하며 쓰기 액세스 유무는 고려되지 않습니다.

MemoryDB와 함께 ACL을 사용하는 방법을 자세히 알아보려면 [액세스 제어 목록(ACL)을 사용하여 사용자 인증](https://docs.aws.amazon.com/memorydb/latest/devguide/clusters.acls.html)을 참조하세요.

# 사용 사례
<a name="vector-search-examples"></a>

벡터 검색의 사용 사례는 다음과 같습니다.

## 검색 증강 세대(RAG)
<a name="vector-search-examples-retrieval-augmented-generation"></a>

검색 증강 세대(RAG)는 벡터 검색으로 대규모 데이터에서 관련 구절을 검색하여 대규모 언어 모델(LLM)을 확장합니다. 특히, 인코더는 입력 컨텍스트와 검색 쿼리를 벡터에 임베딩한 다음 가장 가까운 이웃 검색을 사용하여 의미가 유사한 구절을 찾습니다. 이렇게 검색된 구절을 원본 컨텍스트와 연결되면 LLM에 추가적인 정보를 제공하여 사용자에게 보다 정확한 응답을 반환합니다.

![\[검색 증강 세대의 흐름을 보여주는 그림\]](http://docs.aws.amazon.com/ko_kr/memorydb/latest/devguide/images/RAG.png)


## 내구성 있는 시맨틱 캐시
<a name="vector-search-examples-durable-semantic-cache"></a>

시맨틱 캐싱은 FM의 이전 결과를 저장하여 계산 비용을 줄이는 프로세스입니다. 시맨틱 캐싱은 이전 추론에서 얻은 이전 결과를 다시 계산하는 대신 재사용함으로써 FM을 통해 추론하는 데 필요한 계산량을 줄입니다. MemoryDB를 사용하면 내구성이 뛰어난 시맨팅 캐싱이 가능하므로 과거 추론의 데이터 손실을 방지할 수 있습니다. 이를 통해 생성형 AI 애플리케이션이 의미론적으로 유사한 이전 질문의 답변을 활용하여 한 자릿수 밀리초 내에 응답할 수 있으며 불필요한 LLM 추론이 방지되므로 비용을 절감할 수 있습니다.

![\[파운데이션 모델 프로세스를 설명하는 작업 흐름 그림.\]](http://docs.aws.amazon.com/ko_kr/memorydb/latest/devguide/images/FM.png)

+ **시맨틱 검색 적중** - 정의된 유사성 점수를 기준으로 고객의 질의가 이전 질문과 의미상 유사한 경우 FM 버퍼 메모리(MemoryDB)는 4단계에서 이전 질문에 대한 답변을 반환하고 3단계에서는 FM을 호출하지 않습니다. 이렇게 하면 파운데이션 모델(FM)의 지연과 비용 발생을 방지할 수 있어 고객에게 더 빠른 답변을 제공할 수 있습니다.
+ **시맨틱 검색 실패** - 정의된 유사성 점수를 기준으로 고객의 쿼리가 이전 쿼리와 의미상 유사하지 않은 경우 3a단계에서 FM을 호출하여 고객에게 답변을 제공합니다. 그런 다음 FM에서 생성된 응답은 향후 쿼리(3b단계)를 위해 MemoryDB에 벡터로 저장되어 의미상 유사한 질문에 대한 FM 비용을 최소화합니다. 이 흐름에서는 원래 쿼리에 의미상 유사한 질문이 없었기 때문에 4단계를 호출하지 않았습니다.

## 사기 탐지
<a name="vector-search-examples-fraud-detection"></a>

이상 탐지의 한 형태인 사기 탐지는 유효한 거래를 벡터로 표현하고 완전히 새로운 신규 거래의 벡터 표현을 비교합니다. 완전히 새로운 신규 거래가 유효한 거래 데이터를 나타내는 벡터와 유사성이 낮을 때 사기 탐지가 이루어집니다. 이를 통해 가능한 모든 사기 인스턴스를 예측하는 대신 정상적인 행동을 모델링하여 사기를 탐지할 수 있습니다. MemoryDB를 사용하면 조직에서 오탐을 최소화하고 한 자릿수 밀리초의 지연 시간으로 처리량이 높은 기간에 이 작업을 수행할 수 있습니다.

![\[사기 탐지 프로세스를 보여주는 워크플로 다이어그램입니다.\]](http://docs.aws.amazon.com/ko_kr/memorydb/latest/devguide/images/fraud-detection.png)


## 그 외 사용 사례
<a name="vector-search-engines"></a>
+ **추천 엔진**은 항목을 벡터로 표현하여 사용자에게 유사한 제품이나 콘텐츠를 찾을 수 있습니다. 벡터는 속성과 패턴을 분석하여 만들어집니다. 사용자 패턴 및 속성을 기반으로 사용자로부터 좋은 평가를 받은 가장 유사한 벡터를 찾아 이전에 보지 못한 새로운 항목을 사용자에게 추천할 수 있습니다.
+ **문서 검색 엔진**은 텍스트 문서를 의미론적 의미를 포착하는 고밀도 숫자 벡터로 표현합니다. 검색 시 엔진은 검색 쿼리를 벡터로 변환하고 가장 가까운 이웃 검색을 사용하여 쿼리와 벡터가 가장 유사한 문서를 찾습니다. 이 벡터 유사성 접근 방식을 사용하면 단순히 키워드를 일치시키는 대신 의미를 기반으로 문서를 일치시킬 수 있습니다.

# 벡터 검색 기능 및 제한
<a name="vector-search-limits"></a>

## 벡터 검색 가능 여부
<a name="vector-search-availability"></a>

벡터 검색이 활성화된 MemoryDB 구성은 R6g, R7g 및 T4g 노드 유형에서 지원되며 MemoryDB를 사용할 수 있는 모든 AWS 리전에서 사용할 수 있습니다.

검색을 활성화하기 위해 기존 클러스터를 수정할 수 없습니다. 그러나 검색이 비활성화된 클러스터의 스냅샷에서 검색이 활성화된 클러스터를 생성할 수 있습니다.

## 파라미터 제한 사항
<a name="parameter-restrictions"></a>

다음 표는 다양한 벡터 검색 항목에 대한 제한 사항을 보여줍니다.


| 항목 | 최대값 | 
| --- | --- | 
| 벡터의 차원 수 | 32768 | 
| 만들 수 있는 인덱스 수 | 10 | 
| 인덱스의 필드 수 | 50 | 
| FT.SEARCH 및 FT.AGGREGATE TIMEOUT 절(밀리초) | 10000 | 
| FT.AGGREGATE 명령의 파이프라인 단계 수 | 32 | 
| FT.AGGREGATE LOAD 절의 필드 수 | 1024 | 
| FT.AGGREGATE GROUPBY 절의 필드 수 | 16 | 
| FT.AGGREGATE SORTBY 절의 필드 수 | 16 | 
| FT.AGGREGATE PARAM 절의 파라미터 수 | 32 | 
| HNSW M 파라미터 | 512 | 
| HNSW EF\$1CONSTRUCTION 파라미터 | 4096 | 
| HNSW EF\$1RUNTIME 파라미터 | 4096 | 

## 규모 조정 제한
<a name="scaling-restrictions"></a>

MemoryDB에 대한 벡터 검색은 현재 단일 샤드로 제한되며 수평적 크기 조정은 지원되지 않습니다. 벡터 검색은 수직 및 복제 크기 조정을 지원합니다.

## 운영상의 제한 사항
<a name="operational-restrictions"></a>

**인덱스 지속성 및 채우기**

벡터 검색 기능은 인덱스의 정의와 인덱스의 콘텐츠를 유지합니다. 즉, 노드를 시작하거나 다시 시작하게 하는 모든 운영 요청 또는 이벤트 중에 인덱스 정의 및 콘텐츠가 최신 스냅샷에서 복원되고 보류 중인 모든 트랜잭션이 다중 AZ 트랜잭션 로그에서 읽힙니다. 이를 시작하는 데는 사용자 작업이 필요하지 않습니다. 재구축은 데이터가 복원되는 즉시 채우기 작업으로 수행됩니다. 이는 시스템이 정의된 각 인덱스에 대해 [FT.CREATE](https://docs.aws.amazon.com/memorydb/latest/devguide/vector-search-commands-ft.create.html) 명령을 자동으로 실행하는 것과 기능적으로 동일합니다. 데이터가 복원되자마자 노드를 애플리케이션 작업에 사용할 수 있지만 인덱스 채우기가 완료되지 않았을 가능성이 높습니다. 즉, 채우기가 애플리케이션에 다시 표시될 수 있으며, 예를 들어 인덱스 채우기를 사용한 검색 명령은 거부될 수 있습니다. 채우기에 대한 자세한 내용은 [벡터 검색 개요인덱스와 Valkey 및 Redis OSS 키스페이스](vector-search-overview.md#vector-search-indexes-keyspaces)을(를) 참조하세요.

인덱스 채우기 완료는 원본과 복제본 간에 동기화되지 않습니다. 불완전한 동기화가 애플리케이션에 예기치 않게 나타날 수 있으므로 애플리케이션에서 검색 작업을 시작하기 전에 원본과 모든 복제본에서 채우기가 완료되었는지 확인하는 것이 좋습니다.

## 스냅샷 가져오기/내보내기 및 실시간 마이그레이션
<a name="snapshot-restrictions"></a>

RDB 파일에 검색 인덱스가 있으면 해당 데이터 전송의 호환성이 제한됩니다. MemoryDB 벡터 검색 기능에 의해 정의된 벡터 인덱스의 형식은 다른 MemoryDB 벡터 활성화 클러스터에서만 인식됩니다. 또한 MemoryDB 클러스터의 GA 버전에서 평가판 클러스터의 RDB 파일을 가져올 수 있습니다. 그러면 RDB 파일을 로드할 때 인덱스 콘텐츠가 재구축됩니다.

그러나 인덱스가 포함되지 않은 RDB 파일에는 이러한 제한이 적용되지 않습니다. 따라서 내보내기 전에 인덱스를 삭제하여 평가판 클러스터 내의 데이터를 미리 보기가 아닌 클러스터로 내보낼 수 있습니다.

## 메모리 사용
<a name="memory-consumption"></a>

 메모리 소비는 벡터 수, 차원 수, M-값, 벡터가 아닌 데이터(예: 벡터에 연결된 메타데이터 또는 인스턴스에 저장된 기타 데이터)의 양을 기반으로 합니다.

필요한 총 메모리는 실제 벡터 데이터에 필요한 공간과 벡터 인덱스에 필요한 공간의 조합입니다. 벡터 데이터에 필요한 공간은 최적의 메모리 할당을 위해 HASH 또는 JSON 데이터 구조 내에 벡터를 저장하는 데 필요한 실제 용량과 가장 가까운 메모리 슬래브에 대한 오버헤드를 측정하여 계산됩니다. 각 벡터 인덱스는 이러한 데이터 구조에 저장된 벡터 데이터에 대한 참조를 사용하며 효율적인 메모리 최적화를 사용하여 인덱스에 있는 벡터 데이터의 중복 사본을 제거합니다.

벡터 수는 데이터를 벡터로 표현하는 방법에 따라 달라집니다. 예를 들어 단일 문서를 여러 청크로 나타내도록 선택할 수 있습니다. 여기서 각 청크는 벡터를 나타냅니다. 또는 전체 문서를 단일 벡터로 나타내도록 선택할 수 있습니다.

벡터의 차원 수는 선택한 임베딩 모델에 따라 달라집니다. 예를 들어 [AWS Titan](https://aws.amazon.com/bedrock/titan/) 임베딩 모델을 사용하도록 선택하면 차원 수는 1536이 됩니다.

M 파라미터는 인덱스 구성 중에 모든 새 요소에 대해 생성된 양방향 링크 수를 나타냅니다. MemoryDB는 이 값을 16으로 기본 설정합니다. 하지만 이를 재정의할 수 있습니다. M 파라미터가 높으면 높은 차원성 및/또는 높은 재현율 요구 사항에 더 적합하고, M 파라미터가 낮으면 낮은 차원성 및/또는 낮은 재현율 요구 사항에 더 적합합니다. M 값은 인덱스가 커질수록 메모리 소비가 증가합니다.

MemoryDB 콘솔 환경에서 클러스터 설정의 벡터 검색 활성화를 선택하면 벡터 워크로드의 특성에 따라 올바른 인스턴스 유형을 쉽게 선택할 수 있습니다.

![\[AWS 콘솔의 벡터 검색 클러스터 설정입니다.\]](http://docs.aws.amazon.com/ko_kr/memorydb/latest/devguide/images/vector-search-cluster-settings-console.png)




**샘플 워크로드**

고객이 내부 재무 문서를 기반으로 시맨틱 검색 엔진을 구축하려고 합니다. 고객은 현재 1536개 차원을 갖는 titan 임베딩 모델을 사용하여 문서당 10개의 벡터로 청크된 100만 개 재무 문서를 보유하고 있으며 벡터가 아닌 데이터는 없습니다. 고객은 기본값인 16을 M 파라미터로 사용하기로 결정합니다.
+ 벡터: 100만 \$1 10 청크 = 1000만 벡터
+ 차원: 1536
+ 벡터가 아닌 데이터(GB): 0GB
+ M 파라미터: 16

고객은 이 데이터를 사용하고 콘솔에서 벡터 계산기 사용 버튼을 클릭하여 파라미터를 기반으로 권장 인스턴스 유형을 가져올 수 있습니다.

![\[벡터 계산기에 대한 입력을 기반으로 한 벡터 계산기의 권장 노드 유형입니다.\]](http://docs.aws.amazon.com/ko_kr/memorydb/latest/devguide/images/vector-calc1.png)


![\[값이 입력된 벡터 계산기입니다.\]](http://docs.aws.amazon.com/ko_kr/memorydb/latest/devguide/images/vector-calc2.png)


이 예제에서 벡터 계산기는 제공된 파라미터를 기반으로 벡터를 저장하는 데 필요한 메모리를 보유할 수 있는 가장 작은 [MemoryDB r7g 노드 유형](https://aws.amazon.com/memorydb/pricing/)을 찾습니다. 이는 근사치이며, 인스턴스 유형을 테스트하여 요구 사항에 맞는지 확인해야 합니다.



위의 계산 방법과 샘플 워크로드의 파라미터에 따라 이 벡터 데이터는 데이터와 단일 인덱스를 저장하는 데 104.9GB가 필요합니다. 이 경우 사용 가능한 메모리가 105.81GB인 `db.r7g.4xlarge` 인스턴스 유형이 권장됩니다. 다음으로 가장 작은 노드 유형은 너무 작아서 벡터 워크로드를 보유할 수 없습니다.

각 벡터 인덱스는 저장된 벡터 데이터에 대한 참조를 사용하고 벡터 인덱스에 벡터 데이터의 추가 사본을 생성하지 않으므로 인덱스는 비교적 적은 공간을 소비합니다. 이는 여러 인덱스를 만드는 경우뿐만 아니라, 벡터 데이터의 일부가 삭제되어 고품질 벡터 검색 결과를 위한 최적의 노드 연결을 만들도록 HNSW 그래프를 재구성하는 경우에도 매우 유용합니다.

## 채우기 중 메모리 부족
<a name="out-of-memory-backfill"></a>

Valkey 및 Redis OSS 쓰기 작업과 마찬가지로 인덱스 채우기에는 메모리 부족 제한이 적용됩니다. 채우기가 진행되는 동안 엔진 메모리가 가득 차면 모든 채우기가 일시 중지됩니다. 메모리를 사용할 수 있게 되면 채우기가 다시 시작됩니다. 메모리 부족으로 인해 채우기가 일시 중지된 경우 삭제하고 인덱싱할 수도 있습니다.

## 트랜잭션
<a name="transactions"></a>

`FT.CREATE`, `FT.DROPINDEX`, `FT.ALIASADD`, `FT.ALIASDEL`, 및 `FT.ALIASUPDATE` 명령은 트랜잭션 컨텍스트에서 실행할 수 없습니다. 즉, MULTI/EXEC 블록, LUA 또는 FUNCTION 스크립트 내에서는 실행할 수 없습니다.

# 벡터 검색이 가능한 클러스터 생성
<a name="vector-search-cluster"></a>

 AWS Management Console또는를 사용하여 벡터 검색이 활성화된 클러스터를 생성할 수 있습니다 AWS Command Line Interface. 접근 방식에 따라 벡터 검색을 활성화하기 위한 고려 사항을 구현해야 합니다.

## 사용 AWS Management Console
<a name="vector-search-console"></a>

콘솔 내에서 벡터 검색이 가능한 클러스터를 만들려면 **클러스터** 설정에서 벡터 검색을 활성화해야 합니다. 벡터 검색은 단일 샤드 구성의 MemoryDB 버전 7.1에서 사용할 수 있습니다.

![\[‘벡터 검색 활성화’ 옵션이 선택된 클러스터 설정을 보면 특정 버전 및 구성 지원에 대한 정보를 확인할 수 있습니다.\]](http://docs.aws.amazon.com/ko_kr/memorydb/latest/devguide/images/vs-2.png)


에서 벡터 검색을 사용하는 방법에 대한 자세한 내용은 단원을 AWS Management Console참조하십시오[클러스터 생성(콘솔)](getting-started.md#clusters.createclusters.viewdetails.cluster).

## 사용 AWS Command Line Interface
<a name="vector-search-cli"></a>

벡터 검색이 가능한 MemoryDB 클러스터를 생성하려면 MemoryDB [create-cluster](https://docs.aws.amazon.com/cli/latest/reference/memorydb/create-cluster.html) 명령을 사용하여 변경 불가능한 파라미터 그룹 `default.memorydb-redis7.search`를 전달하여 벡터 검색 기능을 활성화하면 됩니다.

```
aws memorydb create-cluster \
  --cluster-name <value> \
  --node-type <value> \
  --engine redis \
  --engine-version 7.1 \
  --num-shards 1 \
  --acl-name <value> \
  --parameter-group-name default.memorydb-redis7.search
```

선택적으로 다음 예제와 같이 새 파라미터 그룹을 생성하여 벡터 검색을 활성화할 수도 있습니다. 파라미터 그룹에 대한 자세한 내용은 [여기](parametergroups.management.md)에서 확인할 수 있습니다.

```
aws memorydb create-parameter-group \
  --parameter-group-name my-search-parameter-group \
  --family memorydb_redis7
```

그런 다음 새로 생성된 파라미터 그룹에서 search-enabled 파라미터를 yes로 업데이트합니다.

```
aws memorydb update-parameter-group \
  --parameter-group-name my-search-parameter-group \
  --parameter-name-values "ParameterName=search-enabled,ParameterValue=yes"
```

이제 기본 파라미터 그룹 대신 이 사용자 지정 파라미터 그룹을 사용하여 MemoryDB 클러스터에서 벡터 검색을 활성화할 수 있습니다.

# 벡터 검색 명령
<a name="vector-search-commands"></a>

다음은 벡터 검색에 지원되는 명령 목록입니다.

**Topics**
+ [FT.CREATE](vector-search-commands-ft.create.md)
+ [FT.SEARCH](vector-search-commands-ft.search.md)
+ [FT.AGGREGATE](vector-search-commands-ft.aggregate.md)
+ [FT.DROPINDEX](vector-search-commands-ft.dropindex.md)
+ [FT.INFO](vector-search-commands-ft.info.md)
+ [FT.\$1LIST](vector-search-commands-ft.list.md)
+ [FT.ALIASADD](vector-search-commands-ft.aliasadd.md)
+ [FT.ALIASDEL](vector-search-commands-ft.aliasdel.md)
+ [FT.ALIASUPDATE](vector-search-commands-ft.aliasupdate.md)
+ [FT.\$1ALIASLIST](vector-search-commands-ft.aliaslist.md)
+ [FT.PROFILE](vector-search-commands-ft.profile.md)
+ [FT.EXPLAIN](vector-search-commands-ft.explain.md)
+ [FT.EXPLAINCLI](vector-search-commands-ft.explain-cli.md)

# FT.CREATE
<a name="vector-search-commands-ft.create"></a>

 인덱스를 생성하고 해당 인덱스 채우기를 시작합니다. 인덱스 구성에 대한 자세한 내용은 [벡터 검색 개요](https://docs.aws.amazon.com/memorydb/latest/devguide/vector-search-overview.html)를 참조하세요.

**구문**

```
FT.CREATE <index-name>
ON HASH | JSON
[PREFIX <count> <prefix1> [<prefix2>...]]
SCHEMA 
(<field-identifier> [AS <alias>] 
  NUMERIC 
| TAG [SEPARATOR <sep>] [CASESENSITIVE] 
| TEXT
| VECTOR [HNSW|FLAT] <attr_count> [<attribute_name> <attribute_value>])

)+
```

**스키마**
+ 필드 식별자:
  + HASH 키의 경우 필드 식별자는 필드 이름입니다.
  + JSON 키의 경우 필드 식별자는 JSON 경로입니다.

  자세한 내용은 [인덱스 필드 유형](vector-search-overview.md#vector-search-index-field-types) 단원을 참조하십시오.
+ 필드 유형:
  + TAG: 자세한 내용은 [태그](https://redis.io/docs/interact/search-and-query/advanced-concepts/tags/)를 참조하세요.
  + NUMERIC: 필드에는 숫자가 포함됩니다.
  + TEXT: 필드에는 모든 데이터 BLOB이 포함됩니다.
  + VECTOR: 벡터 검색을 지원하는 벡터 필드입니다.
    + 알고리즘 - Hierarchical Navigable Small Worlds(HSNW) 또는 무차별 암호 대입(FLAT)일 수 있습니다.
    + `attr_count` - 알고리즘 구성으로 전달되는 속성의 수입니다. 여기에는 이름과 값이 모두 포함됩니다.
    + `{attribute_name} {attribute_value}` - 인덱스 구성을 정의하는 알고리즘별 키/값 쌍입니다.

      FLAT 알고리즘의 경우 속성은 다음과 같습니다.

      필수 항목 여부:
      + DIM - 벡터의 차원 개수입니다.
      + DISTANCE\$1METRIC - [L2 \$1 IP \$1 COSINE] 중 하나일 수 있습니다.
      + TYPE - 벡터 유형입니다. `FLOAT32` 유형만 지원됩니다.

      선택 사항:
      + INITIAL\$1CAP - 인덱스의 초기 벡터 용량은 인덱스의 메모리 할당 크기에 영향을 줍니다.

      HNSW 알고리즘의 경우 속성은 다음과 같습니다.

      필수 항목 여부:
      + TYPE - 벡터 유형입니다. `FLOAT32` 유형만 지원됩니다.
      + DIM - 벡터 차원으로, 양의 정수로 지정됩니다. 최댓값: 32,768
      + DISTANCE\$1METRIC - [L2 \$1 IP \$1 COSINE] 중 하나일 수 있습니다.

      선택 사항:
      + INITIAL\$1CAP - 인덱스의 초기 벡터 용량은 인덱스의 메모리 할당 크기에 영향을 줍니다. 기본값은 1024입니다.
      + M - 각 계층의 그래프에서 각 노드에 허용되는 최대 발신 엣지 수입니다. 계층 0에서 최대 발신 엣지 수는 2M입니다. 기본값은 16이고 최대값은 512입니다.
      + EF\$1CONSTRUCTION - 인덱스 생성 중에 검사되는 벡터 수를 제어합니다. 이 파라미터의 값이 높을수록 인덱스 생성 시간이 길어지는 대신 재현율이 향상됩니다. 기본값은 200입니다. 최대값은 4,096입니다.
      + EF\$1RUNTIME - 쿼리 작업 중에 검사되는 벡터 수를 제어합니다. 이 파라미터의 값이 높을수록 쿼리 시간이 길어지는 대신 재현율이 향상될 수 있습니다. 이 파라미터의 값은 쿼리별로 재정의할 수 있습니다. 기본값은 10입니다. 최대값은 4,096입니다.

**반환**

간단한 문자열 OK 메시지 또는 오류 응답을 반환합니다.

**예시**

**참고**  
다음 예시에서는 Valkey 또는 Redis OSS로 전송하기 전에 [valkey-cli](https://valkey.io/topics/cli/) 고유의 인수(예: 데이터 인용 제거 및 이스케이프 제거)를 사용합니다. 다른 프로그래밍 언어 클라이언트(Python, Ruby, C\$1 등)를 사용하려면 해당 환경의 문자열 및 이진 데이터 처리 규칙을 따릅니다. 지원되는 클라이언트에 대한 자세한 내용은에서 [빌드할 도구를 참조하세요. AWS](https://aws.amazon.com/developer/tools/)

**Example 1: 인덱스 만들기**  
크기가 2인 벡터에 대한 인덱스 만들기  

```
FT.CREATE hash_idx1 ON HASH PREFIX 1 hash: SCHEMA vec AS VEC VECTOR HNSW 6 DIM 2 TYPE FLOAT32 DISTANCE_METRIC L2
OK
```
HNSW 알고리즘을 사용하여 6차원 JSON 인덱스를 생성합니다.  

```
FT.CREATE json_idx1 ON JSON PREFIX 1 json: SCHEMA $.vec AS VEC VECTOR HNSW 6 DIM 6 TYPE FLOAT32 DISTANCE_METRIC L2
OK
```

**Example 예제 2: 일부 데이터 채우기**  
다음 명령은 redis-cli 터미널 프로그램에 대한 인수로 실행할 수 있도록 형식이 지정되었습니다. 프로그래밍 언어 클라이언트(Python, Ruby, C\$1 등)를 사용하는 개발자는 해당 환경의 문자열 및 이진 데이터 처리 규칙을 따라야 합니다.  
일부 해시 및 json 데이터 생성:  

```
HSET hash:0 vec "\x00\x00\x00\x00\x00\x00\x00\x00"
HSET hash:1 vec "\x00\x00\x00\x00\x00\x00\x80\xbf"
JSON.SET json:0 . '{"vec":[1,2,3,4,5,6]}'
JSON.SET json:1 . '{"vec":[10,20,30,40,50,60]}'
JSON.SET json:2 . '{"vec":[1.1,1.2,1.3,1.4,1.5,1.6]}'
```
다음 사항에 유의하세요.  
+ HASH 및 JSON 데이터의 키에는 인덱스 정의의 접두사가 있습니다.
+ 벡터는 인덱스 정의의 적절한 경로에 있습니다.
+ HASH 벡터는 16진수 데이터로 입력되고 JSON 데이터는 숫자로 입력됩니다.
+ 벡터는 적절한 길이이고, 2차원 HASH 벡터 항목은 부동 소수점 2자리의 16진수 데이터로 구성되며, 6차원 JSON 벡터 항목은 6자리 숫자로 구성됩니다.

**Example 예제 3: 인덱스 삭제 후 다시 생성**  

```
FT.DROPINDEX json_idx1
OK

FT.CREATE json_idx1 ON JSON PREFIX 1 json: SCHEMA $.vec AS VEC VECTOR FLAT 6 DIM 6 TYPE FLOAT32 DISTANCE_METRIC L2
OK
```
새 JSON 인덱스는 `FLAT` 알고리즘 대신 `HNSW` 알고리즘을 사용합니다. 또한 기존 JSON 데이터를 다시 인덱싱합니다.  

```
FT.SEARCH json_idx1 "*=>[KNN 100 @VEC $query_vec]" PARAMS 2 query_vec "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" DIALECT 2
1) (integer) 3
2) "json:2"
3) 1) "__VEC_score"
   2) "11.11"
   3) "$"
   4) "[{\"vec\":[1.1, 1.2, 1.3, 1.4, 1.5, 1.6]}]"
4) "json:0"
5) 1) "__VEC_score"
   2) "91"
   3) "$"
   4) "[{\"vec\":[1.0, 2.0, 3.0, 4.0, 5.0, 6.0]}]"
6) "json:1"
7) 1) "__VEC_score"
   2) "9100"
   3) "$"
   4) "[{\"vec\":[10.0, 20.0, 30.0, 40.0, 50.0, 60.0]}]"
```

# FT.SEARCH
<a name="vector-search-commands-ft.search"></a>

제공된 쿼리 표현식을 사용하여 인덱스 내에서 키를 찾습니다. 찾은 후에는 해당 키 내에 있는 인덱싱된 필드의 수 및/또는 내용을 반환할 수 있습니다. 자세한 내용은 [벡터 검색 쿼리 표현식](https://docs.aws.amazon.com/memorydb/latest/devguide/vector-search-overview.html#vector-search-query-expression)을 참조하세요.

이러한 예제에서 사용할 데이터를 생성하려면 [FT.CREATE](https://docs.aws.amazon.com/memorydb/latest/devguide/vector-search-commands-ft.create.html) 명령을 참조하세요.

**구문**

```
FT.SEARCH <index-name> <query>
[RETURN <token_count> (<field-identifier> [AS <alias>])+]
[TIMEOUT timeout] 
[PARAMS <count> <name> <value> [<name> <value>]]
[LIMIT <offset> <count>]
[COUNT]
```
+ RETURN: 이 절은 반환되는 키 필드를 식별합니다. 각 필드의 선택적 AS 절은 결과의 필드 이름을 대체합니다. 이 인덱스에 대해 선언된 필드만 지정할 수 있습니다.
+ LIMIT: <offset> <count>: 이 절은 오프셋 및 개수 값을 충족하는 키만 반환하는 페이지 매김 기능을 제공합니다. 이 절을 생략하면 기본값은 ‘LIMIT 0 10’입니다. 즉, 최대 10개의 키만 반환됩니다.
+ PARAMS: 키 값 쌍 수의 2배입니다. 파라미터 키/값 쌍은 쿼리 표현식 내에서 참조할 수 있습니다. 자세한 내용은 [벡터 검색 쿼리 표현식](https://docs.aws.amazon.com/memorydb/latest/devguide/vector-search-overview.html#vector-search-query-expression)을 참조하세요.
+ COUNT: 이 절은 키 콘텐츠 반환을 억제하고 키 수만 반환합니다. 이는 ‘LIMIT 0 0’의 별칭입니다.

**반환**

배열 또는 오류 응답을 반환합니다.
+ 작업이 성공적으로 완료되면 배열을 반환합니다. 첫 번째 요소는 쿼리와 일치하는 총 키 수입니다. 나머지 요소는 키 이름과 필드 목록 쌍입니다. 필드 목록은 필드 이름과 값 쌍으로 구성된 또 다른 배열입니다.
+ 인덱스가 다시 채워지고 있는 경우 명령은 즉시 오류 응답을 반환합니다.
+ 제한 시간에 도달하면 명령이 오류 응답을 반환합니다.

**예시: 몇 가지 검색 수행**

**참고**  
다음 예시에서는 Valkey 또는 Redis OSS로 전송하기 전에 [valkey-cli](https://valkey.io/topics/cli/) 고유의 인수(예: 데이터 인용 제거 및 이스케이프 제거)를 사용합니다. 다른 프로그래밍 언어 클라이언트(Python, Ruby, C\$1 등)를 사용하려면 해당 환경의 문자열 및 이진 데이터 처리 규칙을 따릅니다. 지원되는 클라이언트에 대한 자세한 내용은에서 [빌드할 도구를 참조하세요. AWS](https://aws.amazon.com/developer/tools/)

**해시 검색**

```
FT.SEARCH hash_idx1 "*=>[KNN 2 @VEC $query_vec]" PARAMS 2 query_vec "\x00\x00\x00\x00\x00\x00\x00\x00" DIALECT 2
1) (integer) 2
2) "hash:0"
3) 1) "__VEC_score"
   2) "0"
   3) "vec"
   4) "\x00\x00\x00\x00\x00\x00\x00\x00"
4) "hash:1"
5) 1) "__VEC_score"
   2) "1"
   3) "vec"
   4) "\x00\x00\x00\x00\x00\x00\x80\xbf"
```

쿼리 벡터와의 거리(16진수)인 점수를 기준으로 정렬된 결과 두 개가 생성됩니다.

**JSON 검색**

```
FT.SEARCH json_idx1 "*=>[KNN 2 @VEC $query_vec]" PARAMS 2 query_vec "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" DIALECT 2
1) (integer) 2
2) "json:2"
3) 1) "__VEC_score"
   2) "11.11"
   3) "$"
   4) "[{\"vec\":[1.1, 1.2, 1.3, 1.4, 1.5, 1.6]}]"
4) "json:0"
5) 1) "__VEC_score"
   2) "91"
   3) "$"
   4) "[{\"vec\":[1.0, 2.0, 3.0, 4.0, 5.0, 6.0]}]"
```

가장 근사한 결과가 두 개가 점수별로 정렬되어 생성됩니다. 참고로 JSON 벡터 값은 부동 수로 변환되고 쿼리 벡터는 벡터 데이터입니다. 또한 `KNN` 파라미터가 2이기 때문에 결과가 두 개만 반환됩니다. 값이 클수록 더 많은 결과가 반환됩니다.

```
FT.SEARCH json_idx1 "*=>[KNN 100 @VEC $query_vec]" PARAMS 2 query_vec "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" DIALECT 2
1) (integer) 3
2) "json:2"
3) 1) "__VEC_score"
   2) "11.11"
   3) "$"
   4) "[{\"vec\":[1.1, 1.2, 1.3, 1.4, 1.5, 1.6]}]"
4) "json:0"
5) 1) "__VEC_score"
   2) "91"
   3) "$"
   4) "[{\"vec\":[1.0, 2.0, 3.0, 4.0, 5.0, 6.0]}]"
6) "json:1"
7) 1) "__VEC_score"
   2) "9100"
   3) "$"
   4) "[{\"vec\":[10.0, 20.0, 30.0, 40.0, 50.0, 60.0]}]"
```

# FT.AGGREGATE
<a name="vector-search-commands-ft.aggregate"></a>

FT.SEARCH 명령의 상위 집합으로, 쿼리 표현식으로 선택한 키의 상당 수를 추가로 처리할 수 있습니다.

**구문**

```
FT.AGGREGATE index query
  [LOAD * | [count field [field ...]]]
  [TIMEOUT timeout]
  [PARAMS count name value [name value ...]]
  [FILTER expression]
  [LIMIT offset num]  
  [GROUPBY count property [property ...] [REDUCE function count arg [arg ...] [AS name] [REDUCE function count arg [arg ...] [AS name] ...]] ...]] 
  [SORTBY count [ property ASC | DESC [property ASC | DESC ...]] [MAX num]] 
  [APPLY expression AS name]
```
+ FILTER, LIMIT, GROUPBY, SORTBY 및 APPLY 절을 원하는 순서대로 여러 번 반복할 수 있으며 자유롭게 결합할 수 있습니다. 이는 지정된 순서대로 적용되며, 한 절의 출력이 다음 절의 입력이 됩니다.
+ 위 구문에서 ‘속성’은 이 인덱스에 대해 [FT.CREATE](https://docs.aws.amazon.com/memorydb/latest/devguide/vector-search-commands-ft.create.html) 명령으로 선언된 필드이거나 이전 APPLY 절 또는 REDUCE 함수의 출력입니다.
+ LOAD 절은 인덱스에서 선언된 필드를 로드하는 것으로 제한됩니다. ‘LOAD \$1’는 인덱스에 선언된 모든 필드를 로드합니다.
+ 지원되는 리듀서 함수는 COUNT, COUNT\$1DISTINCTISH, SUM, MIN, MAX, AVG, STDDEV, QUANTILE, TOLIST, FIRST\$1VALUE, RANDOM\$1SAMPLE입니다. 자세한 내용은 [집계](https://redis.io/docs/interact/search-and-query/search/aggregations/)를 참조하세요.
+ LIMIT <offset> <count>: <offset>에서 시작하여 <count>로 이어지는 레코드를 유지하며, 다른 모든 레코드는 삭제됩니다.
+ PARAMS: 키 값 쌍 수의 2배입니다. 파라미터 키/값 쌍은 쿼리 표현식 내에서 참조할 수 있습니다.

**반환**

배열 또는 오류 응답을 반환합니다.
+ 작업이 성공적으로 완료되면 배열을 반환합니다. 첫 번째 요소는 특별한 의미가 없는 정수입니다(무시해야 함). 나머지 요소는 마지막 단계에서 출력된 결과입니다. 각 요소는 필드 이름 및 값 쌍의 배열입니다.
+ 인덱스가 다시 채워지고 있는 경우 명령은 즉시 오류 응답을 반환합니다.
+ 제한 시간에 도달하면 명령이 오류 응답을 반환합니다.

# FT.DROPINDEX
<a name="vector-search-commands-ft.dropindex"></a>

인덱스를 삭제합니다. 인덱스 정의 및 관련 콘텐츠가 삭제됩니다. 키는 영향을 받지 않습니다.

**구문**

```
FT.DROPINDEX <index-name>
```

**반환**

간단한 문자열 OK 메시지 또는 오류 응답을 반환합니다.

# FT.INFO
<a name="vector-search-commands-ft.info"></a>

**구문**

```
FT.INFO <index-name>
```

FT.INFO 페이지의 출력은 다음 표에 설명된 대로 키 값 쌍의 배열입니다.


| 키 | 값 유형 | 설명 | 
| --- | --- | --- | 
| index\$1name | 문자열 | 인덱스의 이름 | 
| creation\$1timestamp | 정수 | 생성 시간의 유닉스 스타일 타임스탬프 | 
| key\$1type | 문자열 | 해시 또는 JSON | 
| key\$1prefixes | 문자열 배열 | 이 인덱스의 키 접두사 | 
| 필드 | 필드 정보 배열 | 이 인덱스의 필드 | 
| space\$1usage | 정수 | 이 인덱스에서 사용하는 메모리 바이트 | 
| fullext\$1space\$1usage | 정수 | 벡터가 아닌 필드에서 사용되는 메모리 바이트 | 
| vector\$1space\$1usage | 정수 | 벡터 필드에서 사용되는 메모리 바이트 | 
| num\$1docs | 정수 | 현재 인덱스에 포함된 키 수 | 
| num\$1indexed\$1vectors | 정수 | 현재 인덱스에 포함된 벡터 수 | 
| current\$1lag | 정수 | 최근 수집 지연(밀리초) | 
| backfill\$1status | 문자열 | 다음 중 하나: 완료, 진행 중, 일시 중지됨 또는 실패  | 

다음 테이블은 각 필드에 대한 정보를 나타냅니다.


| Key(키) | 값 유형 | 설명 | 
| --- | --- | --- | 
| 식별자 | 문자열 | 필드 이름 | 
| field\$1name | 문자열 | 해시 멤버 이름 또는 JSON 경로 | 
| 유형 | 문자열 | 숫자, 태그, 텍스트 또는 벡터 중 하나 | 
| 옵션 | 문자열 | 무시 | 

필드 유형이 Vector인 경우 알고리즘에 따라 추가 정보가 표시됩니다.

HNSW 알고리즘의 경우:


| Key(키) | 값 유형 | 설명 | 
| --- | --- | --- | 
| 알고리즘 | 문자열 | HNSW | 
| data\$1type | 문자열 | FLOAT32 | 
| distance\$1metric | 문자열 | 다음 중 하나: L2, IP 또는 코사인 | 
| initial\$1capacity | 정수 | 벡터 필드 인덱스의 초기 크기 | 
| current\$1capacity | 정수 | 현재 벡터 필드 인덱스 크기 | 
| maximum\$1edges | 정수 | 생성 시 M 파라미터 | 
| ef\$1construction | 정수 | 생성 시 EF\$1CONSTRUCTION 파라미터 | 
| ef\$1runtime | 정수 | 생성 시 EF\$1RUNTIME 파라미터 | 

FLAT 알고리즘의 경우:


| Key(키) | 값 유형 | 설명 | 
| --- | --- | --- | 
| 알고리즘 | 문자열 | FLAT | 
| data\$1type | 문자열 | FLOAT32 | 
| distance\$1metric | 문자열 | 다음 중 하나: L2, IP 또는 코사인 | 
| initial\$1capacity | 정수 | 벡터 필드 인덱스의 초기 크기 | 
| current\$1capacity | 정수 | 현재 벡터 필드 인덱스 크기 | 

# FT.\$1LIST
<a name="vector-search-commands-ft.list"></a>

모든 인덱스를 나열합니다.

**구문**

```
FT._LIST 
```

**반환**

인덱스 이름의 배열 반환

# FT.ALIASADD
<a name="vector-search-commands-ft.aliasadd"></a>

색인에 별칭을 추가합니다. 새 별칭 이름은 인덱스 이름이 필요한 모든 곳에서 사용할 수 있습니다.

**구문**

```
FT.ALIASADD <alias> <index-name> 
```

**반환**

간단한 문자열 OK 메시지 또는 오류 응답을 반환합니다.

# FT.ALIASDEL
<a name="vector-search-commands-ft.aliasdel"></a>

색인의 기존 별칭을 삭제합니다.

**구문**

```
FT.ALIASDEL <alias>
```

**반환**

간단한 문자열 OK 메시지 또는 오류 응답을 반환합니다.

# FT.ALIASUPDATE
<a name="vector-search-commands-ft.aliasupdate"></a>

다른 물리적 인덱스를 가리키도록 기존 별칭을 업데이트합니다. 이 명령은 별칭에 대한 향후 참조에만 영향을 줍니다. 진행 중인 작업(FT.SEARCH, FT.AGGREGATE)은 이 명령의 영향을 받지 않습니다.

**구문**

```
FT.ALIASUPDATE <alias> <index>
```

**반환**

간단한 문자열 OK 메시지 또는 오류 응답을 반환합니다.

# FT.\$1ALIASLIST
<a name="vector-search-commands-ft.aliaslist"></a>

인덱스 별칭을 나열합니다.

**구문**

```
FT._ALIASLIST
```

**반환**

현재 별칭 개수 크기의 배열을 반환합니다. 배열의 각 요소는 별칭-인덱스 쌍입니다.

# FT.PROFILE
<a name="vector-search-commands-ft.profile"></a>

쿼리를 실행하고 해당 쿼리에 대한 프로필 정보를 반환합니다.

**구문**

```
FT.PROFILE 

<index>
SEARCH | AGGREGATE 
[LIMITED]
QUERY <query ....>
```

**반환**

요소를 2개 가진 배열입니다. 첫 번째 요소는 프로파일링된 `FT.SEARCH` 또는`FT.AGGREGATE` 명령의 결과입니다. 두 번째 요소는 성능 및 프로파일링 정보의 배열입니다.

# FT.EXPLAIN
<a name="vector-search-commands-ft.explain"></a>

쿼리를 구문 분석하고 해당 쿼리가 어떻게 구문 분석되었는지에 대한 정보를 반환합니다.

**구문**

```
FT.EXPLAIN <index> <query>
```

**반환**

구문 분석된 결과를 포함하는 문자열입니다.

# FT.EXPLAINCLI
<a name="vector-search-commands-ft.explain-cli"></a>

결과가 다른 형식으로 표시된다는 점을 제외하면 FT.EXPLAIN 명령과 동일합니다. redis-cli를 사용할 때 더 유용합니다.

**구문**

```
FT.EXPLAINCLI <index> <query>
```

**반환**

구문 분석된 결과를 포함하는 문자열입니다.