기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
아마존 서비스의 K-최근접이웃 (k-nn) 검색 OpenSearch
관련 k-최근접이웃 알고리즘의 줄임말인 k-NN for Amazon OpenSearch Service를 사용하면 벡터 공간에서 점을 검색하고 유클리드 거리 또는 코사인 유사성을 기준으로 해당 점의 “가장 가까운 이웃”을 찾을 수 있습니다. 사용 사례에는 권장 사항(예: 음악 애플리케이션의 “좋아하는 다른 노래” 기능), 이미지 인식 및 사기 탐지가 포함됩니다.
참고
이 문서에서는 Service와 다양한 k-NN 플러그인 버전 간의 버전 호환성과 관리형 OpenSearch 서비스와 함께 플러그인을 사용할 때의 제한 사항에 대해 설명합니다. OpenSearch 단순하고 복잡한 예제, 파라미터 참조, 플러그인에 대한 전체 API 참조 등 k-NN 플러그인에 대한 포괄적인 설명서는 오픈 소스 설명서를 참조하십시오. OpenSearch
다음 표를 사용하여 Amazon OpenSearch Service 도메인에서 실행 중인 k-NN 플러그인 버전을 확인할 수 있습니다. 각 k-NN 플러그인 버전은 또는 Elasticsearch 버전에 해당합니다. OpenSearch
OpenSearch | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
OpenSearch 버전 | k-NN 플러그인 버전 | 주목할 만한 기능 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
2.13 | 2.13.0.0 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
2.11 | 2.11.0.0 |
k-NN 쿼리에서 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
2.9 | 2.9.0.0 | Faiss |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
2.7 | 2.7.0.0 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
2.5 | 2.5.0.0 | k-NN 모델 시스템 SystemIndexPlugin 인덱스용으로 확장, 코어 HybridFS에 Lucene 전용 파일 확장명 추가 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
2.3 | 2.3.0.0 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1.3 | 1.3.0.0 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1.2 | 1.2.0.0 | Faiss |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1.1 | 1.1.0.0 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1.0 |
1.0.0.0 |
이전 버전과의 호환성을 지원하면서 REST API의 이름이 바뀌었습니다. 네임스페이스 이름이 opendistro 에서 opensearch 로 바뀌었습니다. |
Elasticsearch | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Elasticsearch 버전 | k-NN 플러그인 버전 | 주목할 만한 기능 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
7.1 |
1.3.0.0 |
유클리드 거리 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
7.4 |
1.4.0.0 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
7.7 |
1.8.0.0 |
코사인 유사성 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
7.8 |
1.9.0.0 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
7.9 |
1.11.0.0 |
웜업 API, 사용자 지정 점수 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
7.10 |
1.13.0.0 |
Hamming 거리, L1 표준 거리, Painless 스크립팅 |
k-NN 시작하기
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 } } } }
최적의 성능을 유지하면서 대량의 쿼리를 처리해야 하는 경우 _msearch
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 쿼리에 대한 대량 벡터 검색을 설정하는 방법을 보여줍니다.
k-NN의 차이점, 조정, 제한 사항
OpenSearch API를 사용하여 모든 k-NN_cluster/settings
OpenSearch 서비스에서는 knn.memory.circuit_breaker.enabled
및 를 제외한 모든 설정을 변경할 수 있습니다knn.circuit_breaker.triggered
. k-NN 통계는 Amazon CloudWatch 지표로 포함됩니다.
특히 각 데이터 노드의 KNNGraphMemoryUsage
측정치를 knn.memory.circuit_breaker.limit
통계 및 인스턴스 유형에 사용할 수 있는 RAM과 비교하여 확인하십시오. OpenSearch 서비스는 인스턴스 RAM의 절반을 Java 힙에 사용합니다 (힙 크기 최대 32GiB). 기본적으로 k-NN은 나머지 절반의 최대 50%를 사용하므로 RAM이 32GiB인 인스턴스 유형에서는 그래프 8GiB(32 * 0.5 * 0.5)를 수용할 수 있습니다. 그래프 메모리 사용량이 이 값을 초과하면 성능이 저하될 수 있습니다.
인덱스에서 대략적인 k-NN () 을 사용하는 경우 k-NN 인덱스를 콜드 스토리지로 마이그레이션할 UltraWarm수 없습니다."index.knn": true
index.knn
이 false
(정확한 k-NN