본문 바로가기
Big Data/ElasticSearch

[ElasticSearch] Elastiknn 플러그인 설치 및 실행

by Dogf 2021. 8. 23.
반응형

Linux환경에서 ElasticSearch에 Elastiknn 플러그인을 설치해봅니다.

 

Elastiknn은 Nearest Neighbor 검색을 위한 Elasticsearch 플러그인입니다.

 

이는 이미지 검색, 유사도 검색 등에 활용될 수 있습니다.

 

0. 준비하기

 

1) Elasticsearch 7.13.3 설치하기

Elastiknn 플러그인 설치를 위해서, 호환 가능한 ElasticSearch를 설치합니다.

 

https://www.elastic.co/kr/downloads/past-releases/elasticsearch-7-13-3

 

Elasticsearch 7.13.3 | Elastic

 

www.elastic.co

 

 

 

2) JDK 11 버전 설치하기

Elastiknn은 JDK 11 버전 환경으로 개발되어있습니다. 

JDK 8 버전으로 설치하고 실행할 경우 ERROR가 발생하니 주의하시기 바랍니다.

 

https://www.oracle.com/kr/java/technologies/javase-jdk11-downloads.html

 

3) Kibana 7.13.3 설치하기

Elastiknn 플러그인을 활용한 쿼리를 확인하기 위해 ElasticSearch와 동일한 버전으로 설치해줍니다.

ElasticSearch와 버전이 다른 Kibana를 설치하고 실행할 경우 ERROR가 발생하니 주의하시기 바랍니다.

https://www.elastic.co/kr/downloads/past-releases/kibana-7-13-3

 

Kibana 7.13.3 | Elastic

 

www.elastic.co

 

 

1. 설치하기

 

Elastiknn을 설치하기 위해 다음 명령어를 칩니다.

~/elastic/elasticsearch-7.13.3/bin$ ./elasticsearch-plugin install --batch https://github.com/alexklibisz/elastiknn/releases/download/7.13.3.2/elastiknn-7.13.3.2.zip

 

실행하면, 로그가 쭉 나오고 빨간색으로 밑줄 쳐 있는 부분처럼

 

...

-> Installed elastiknn

...

라고 나오고 뒤에 에러가 없으면 정상적으로 실행된 겁니다.

 

Elastiknn 설치 완료

 

Elastiknn 설치 완료되었습니다.

 

2. 확인하기

 

1) ElasticSearch 실행 하기

설치 완료 후, ElasticSearch를 실행합니다.

다음과 같이 나왔을 때 정상적으로 구동되고 있음을 확인할 수 있습니다.

 

실행하면, 로그가 쭉 나오고 빨간색으로 표시 부분처럼

...

[node-1] loaded plugin [elastiknn]

...

라고 나오고 뒤에 에러가 없으면 정상적으로 실행된 겁니다.

 

2) Elastiknn 사용 하기

 

Elastiknn 테스트를 위해 다음과 같이 index를 생성해줍니다.

 

Elastiknn을 활용하기 위해서는 다음과 같은 설정이 필요합니다.

 

elastiknn을 사용하기 위해서는 index의 settings 부분에 "elastiknn" 값을 true로 설정해두어야 하며, mappings 부분에서는 type을 "elastiknn_dense_float_vector"로 하고 "elastiknn" 하위에는 벡터의 차원 수와 사용 모델, 유사도 함수를 설정하면 됩니다.

PUT knn_test
{
  "settings": {
    "index": {
      "elastiknn": true               
    }
  },
  "mappings": {
    "properties": {
        "my_vec": {
            "type": "elastiknn_dense_float_vector", 
            "elastiknn": {
                "dims": 3,                        
                "model": "lsh",                     
                "similarity": "cosine",             
                "L": 99,                            
                "k": 1                              
            }
        }
    }
  }
}

 

검색을 위해 다음과 같이 샘플 데이터를 추가해줍니다.

PUT knn_test/_doc/1
{
  "title" : "김정은",
  "my_vec": {
      "values": [0.1, 0.2, 0.3]
  }
}

PUT knn_test/_doc/2
{
  "title" : "트럼프",
  "my_vec": {
      "values": [0.2, 0.3, 0.4]
  }
}

PUT knn_test/_doc/3
{
  "title" : "대통령",
  "my_vec": {
      "values": [0.4, 0.5, 0.6]
  }
}

PUT knn_test/_doc/4
{
  "title" : "문재인",
  "my_vec": {
      "values": [0.5, 0.6, 0.7]
  }
}

PUT knn_test/_doc/5
{
  "title" : "문재인 대통령",
  "my_vec": {
      "values": [0.6, 0.7, 0.8]
  }
}

 

마지막으로, 다음과 같이 쿼리를 구성하여 검색해봅니다.

GET knn_test/_search
{
  "_source": ["title"], 
    "query": {
        "elastiknn_nearest_neighbors": {
            "field": "my_vec",                     
            "vec": {                               
                "values": [0.6, 0.7, 0.8]
            },
            "model": "lsh",                        
            "similarity": "cosine",              
            "candidates": 50        
        }
    }
}

색인된 벡터 값을 가지는 필드명을 기입하고, 

 

vec필드 하위 values 부분에 검색할 벡터를 넣어주면,

 

lsh 모델 cosine 유사도 검색이 수행됩니다.

 

수행 결과는 다음과 같습니다.

{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 5,
      "relation" : "eq"
    },
    "max_score" : 2.0,
    "hits" : [
      {
        "_index" : "knn_test",
        "_type" : "_doc",
        "_id" : "5",
        "_score" : 2.0,
        "_source" : {
          "title" : "문재인 대통령"
        }
      },
      {
        "_index" : "knn_test",
        "_type" : "_doc",
        "_id" : "4",
        "_score" : 1.9998169,
        "_source" : {
          "title" : "문재인"
        }
      },
      {
        "_index" : "knn_test",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : 1.9989535,
        "_source" : {
          "title" : "대통령"
        }
      },
      {
        "_index" : "knn_test",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 1.9888291,
        "_source" : {
          "title" : "트럼프"
        }
      },
      {
        "_index" : "knn_test",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.9633753,
        "_source" : {
          "title" : "김정은"
        }
      }
    ]
  }
}

 

 

이상입니다.

 

 

반응형

댓글