[OpenSearch] OpenSearch 에서 k-NN 유사도 검색

Woong·2024년 10월 11일
0

ElasticSearch

목록 보기
25/28

OpenSearch k-NN

  • k-NN 3가지 방식을 제공
  • opensearch-knn plugin 설치 필요

Approximate k-NN

  • 근사적 k-nearest neighbor 반환
  • 응답시간 단축, 메모리 사용량 감소 -> 대규모 인덱스에 적합

Script Score k-NN

  • script_score 를 통해 knn_vector , binary 타입 필드에 대해 정확한 k-NN 검색 수행

  • 적은 규모의 인덱스를 검색하거나, 사전 필터링이 필요한 경우 유용

    • 대규모 인덱스일 경우 당연히 Approximate k-NN 에 비해 느린 성능
  • 예제

PUT my-knn-index-1
{
  "mappings": {
    "properties": {
      "my_vector1": {
        "type": "knn_vector",
        "dimension": 2
      },
      "my_vector2": {
        "type": "knn_vector",
        "dimension": 4
      }
    }
  }
}
POST _bulk
{ "index": { "_index": "my-knn-index-1", "_id": "1" } }
{ "my_vector1": [1.5, 2.5], "price": 12.2 }
{ "index": { "_index": "my-knn-index-1", "_id": "2" } }
{ "my_vector1": [2.5, 3.5], "price": 7.1 }
{ "index": { "_index": "my-knn-index-1", "_id": "3" } }
{ "my_vector1": [3.5, 4.5], "price": 12.9 }
{ "index": { "_index": "my-knn-index-1", "_id": "4" } }
{ "my_vector1": [5.5, 6.5], "price": 1.2 }
{ "index": { "_index": "my-knn-index-1", "_id": "5" } }
{ "my_vector1": [4.5, 5.5], "price": 3.7 }
{ "index": { "_index": "my-knn-index-1", "_id": "6" } }
{ "my_vector2": [1.5, 5.5, 4.5, 6.4], "price": 10.3 }
{ "index": { "_index": "my-knn-index-1", "_id": "7" } }
{ "my_vector2": [2.5, 3.5, 5.6, 6.7], "price": 5.5 }
{ "index": { "_index": "my-knn-index-1", "_id": "8" } }
{ "my_vector2": [4.5, 5.5, 6.7, 3.7], "price": 4.4 }
{ "index": { "_index": "my-knn-index-1", "_id": "9" } }
{ "my_vector2": [1.5, 5.5, 4.5, 6.4], "price": 8.9 }
  • query 에서 filter 적용 + script 에서 knn_score
    • lang: 스크립트 타입. script score k-NN 에서는 knn 사용
    • field: vector 데이터 필드명
    • query_value : nearest neighbor 를 찾을 쿼리 vector
    • space_type : 사용할 거리 함수
      • l1, l2, linf, cosinesimil (코사인 유사도), innerproduct, hammingbit, hamming
      • 코사인 유사도cosinesimil는 [-1,1] 범위 계산 후 +1 하여 응답 (음수 응답 불가하므로)
GET my-knn-index-2/_search
{
  "size": 2,
  "query": {
    "script_score": {
      "query": {
        "bool": {
          "filter": {
            "term": {
              "color": "BLUE"
            }
          }
        }
      },
      "script": {
        "lang": "knn",
        "source": "knn_score",
        "params": {
          "field": "my_vector",
          "query_value": [9.9, 9.9],
          "space_type": "l2"
        }
      }
    }
  }
}

Painless extensions

  • pain less 스크립트를 활용한 k-NN 검색
  • 사전 필터링 지원
  • Script score k-NN 에 비해 느린 성능
  • 커스텀이 많이 필요할 경우 유용

reference

0개의 댓글

관련 채용 정보