Elasticsearch에 Dense embedding + Cosine Similarity 적용하기

yoonene·2023년 2월 21일
0

Elasticsearch

목록 보기
6/14

Elasticsearch에 Dense embedding + Cosine Similarity 적용해서 dense score 알고리즘을 사용해서도 빠른 속도로 검색할 수 있게 하였다.

  1. Dense embedding: Dense model로 encoding해서 indexing
  2. Cosine Similarity: script_score
    2-1. keyword로 filter 후 Cos_sim으로 계산하기

1. Dense embedding

이 링크에 걸어둔 코드
모델: tensorflow pretrained 모델
데이터: json
형식일 때 indexing + search하는 코드이고,

필자는
이렇게 코드를 바꿔서
모델: huggingface에 있는 모델
데이터: csv 형식
에서 사용할 수 있도록 코드를 수정했다.

2. Cosine Similarity

    body = {
            "query": {
                "script_score": {
                    "query": {"match_all": {}},
                    "script": {
                        "source": "cosineSimilarity(params.query_vector, doc['text_vector']) + 1.0",
                        "params": {"query_vector": query_vector}
                    }
                }
            }
        }

2-1. filter 추가

    body = {
            "query": {
                "script_score": {
                    "query": {
                        "bool":{
                            "filter": [
                                {
                                    "regexp": {
                                        "title": ".*"+keyword.replace(' ', '')+".*"
                                        }
                                }
                            ],
                        }
                    },
                    "script": {
                            "source": "cosineSimilarity(params.query_vector, doc['text_vector']) + 10.0",
                            "params": {"query_vector": query_vector}
                        }
                    }
                }
            }

2-2. 가중치 추가

    body = {
            "query": {
                "script_score": {
                    "query": {
                        "multi_match": {
                            "query": keyword,
                            "fields": ["title^50", "text^10"]
                        }
                    },
                    "script": {
                        "source": "cosineSimilarity(params.query_vector, doc['text_vector']) + 1.0",
                        "params": {"query_vector": query_vector}
                    }
                }
            }
        }
profile
NLP Researcher / Information Retrieval / Search

0개의 댓글