KNN - Amazon Elasticsearch Service

문서의 영문과 번역 사이에 충돌이 있는 경우에는 영문 버전을 따릅니다. 번역 버전은 기계 번역을 사용하여 제공합니다.

KNN

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

유클리드 거리를 가진 KNN은 Elasticsearch 7.1 이상. 코사인 유사성은 Elasticsearch 7.7 이상.

설정 및 통계에 대한 설명을 포함하여 Elasticsearch 기능에 대한 전체 설명서는 Open Distro for Elasticsearch 설명서에서 확인할 수 있습니다. K-Nearest Neighbor 알고리즘에 대한 배경 정보는 Wikipedia를 참조하십시오.

KNN 시작하기

KNN을 사용하려면 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 결과를 얻습니다. KNN은 최대 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 } } } }

KNN의 차이점 및 튜닝

Open Distro for Elasticsearch에서는 _cluster/settings API를 사용하여 모든 KNN 설정을 수정할 수 있습니다. 켜짐 Amazon ES, 다음을 제외한 모든 설정을 변경할 수 있습니다. knn.memory.circuit_breaker.enabledknn.circuit_breaker.triggered. KNN 통계는 다음과 같이 포함됩니다. Amazon CloudWatch 메트릭.

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