[신.만.추]

신입이 만드는 추천시스템-10(엘라스틱서치에 관하여)

이산이 2022. 12. 11. 13:30

이 글은 제가 작업했던 내용을 정리하기 위해 수기 형식으로 작성 된 글입니다.

2022.12.09 - [[신.만.추]] - 신입이 만드는 추천시스템-1(개요)

2022.12.09 - [[신.만.추]] - 신입이 만드는 추천시스템-2(데이터 수집, 스크래핑)

2022.12.09 - [[신.만.추]] - 신입이 만드는 추천시스템-3(셀레니움 최소화)

2022.12.09 - [[신.만.추]] - 신입이 만드는 추천시스템-4(한국어 전처리 및 워드임베딩)

2022.12.10 - [[신.만.추]] - 신입이 만드는 추천시스템-5(아이템 벡터화)

2022.12.10 - [[신.만.추]] - 신입이 만드는 추천시스템-6(웹서버 구축)

2022.12.10 - [[신.만.추]] - 신입이 만드는 추천시스템-7(검색성능향상)

2022.12.10 - [[신.만.추]] - 신입이 만드는 추천시스템-8(포트포워딩)

2022.12.10 - [[신.만.추]] - 신입이 만드는 추천시스템-9(WSGI)


  1. 엘라스틱서치에 관하여
  2. 인덱스 매핑에 관하여
  3. 엘라스틱서치에 데이터 Bulk
  4. 검색쿼리와 점수산정식

저번에 작성했던 글에서 gunicorn+Flask로 추천 서버의 구축을 완료하였다. 하지만 여전히 문제는 남아있었다. 추천 리스트의 퀄리티가 아직 부족하게 느껴졌고, 데이터를 Flask 서버 내에서 직접 로드 후 가공하여 사용하기 때문에 메모리 사용량이 많았다.

초기에는 이를 보완하고자 DB에 직접 검색하는 방식을 활용하려 했지만 검색 속도가 저하되어 적용하지 않았었다.

따라서 데이터를 검색하기 용이하고 속도가 보장되는 검색엔진을 도입해보려 했다.

 

1. 엘라스틱서치에 관하여

 

일반적으로 DB라고 하는 경우, RDBMS를 말하는 경우가 많다. 대표적으로 MySQL이 그 예이다.

 

RDBMS와 엘라스틱서치와의 특징은 아래와 같다.


RDBMS(관계형 데이터베이스)

  1. 지정된 스키마에 따라 데이터가 저장
  2. 명확한 데이터 구조
  3. 테이블 간의 관계성이 있어 시스템이 커질경우 쿼리문이 복잡해 짐
  4. 전문 검색 속도가 느림

엘라스틱서치

  1. JSON형식으로 매핑을 만들어 데이터의 형식 지정
  2. 비정형 데이터를 색인하고 검색할 수 있음
  3. 형태소 분석을 통해 자연어처리 가능
  4. 역색인 구조로 인해 전문 검색속도가 빠름


 

위에서 적었던 엘라스틱서치의 특징 중, 3번과 4번의 특징이 검색엔진을 도입하게 된 계기가 되었다.

현재 플라스크 서버의 경우 아래와 같은 과정을 거쳐 추천 리스트를 리턴해주게 된다.

 


키워드 입력 → 키워드 벡터화 → 기존 벡터데이터와 유사도 계산 →

→ 아이템 텍스트 데이터에서 키워드 카운팅 → 점수화 후 정렬 →

→ 키워드와 정렬된 데이터 키워드와의 유사도 계산 → 상위 키워드 정제 → 데이터 return


 

엘라스틱서치는 검색을 할 때 기본적으로 TF-IDF기반의 BM25라는 방법으로 점수를 산정하여 이를 통해 검색결과를 리턴해 준다.

이러한 점수산정 로직에 키워드 벡터데이터와 아이템 벡터 데이터간의 유사도 계산 로직을 추가하여 리턴해주게 만든다면 메모리에 아이템 텍스트 데이터를 올리지 않으면서 추가적인 유사도 계산을 하지 않고도 추천 시스템을 운용 할 수 있을 것이라고 판단하였다.

 

생각했던 방법으로 서버를 운용하게 된다면 아래의 과정을 거치게 될 것이다.


키워드 입력 → 키워드 벡터화 → 엘라스틱서리 활용 검색 →

→ 키워드와 정렬된 데이터 키워드와의 유사도 계산 → 상위 키워드 정제 → 데이터 return


 

하지만 우려되는 부분도 있었다.

기존의 RDBMS는 table을 만드는데 스키마가 정해져있기때문에 구성하기가 용이하였다.

 

반면에 엘라스틱서치의 경우 mapping을 Json형태로 직접 입력해주어야 하고, 데이터를 넣거나 검색할 때에도 SQL구문이 아닌 Query DSL방식이나 URI방식으로 검색해야 했다.

 

직접 Query DSL을 구성하는 부분이 걱정도 되었지만 검색엔진이 적용 되었을 때 성능이 향상될 것을 기대하며 적용하기로 결정하였다.

 

 

참조링크

https://velog.io/@jakeseo_me/엘라스틱서치-알아보기-2-DB만-있으면-되는데-왜-굳이-검색엔진

https://victorydntmd.tistory.com/313

https://jinyes-tistory.tistory.com/304

https://ta-ye.github.io/2021-03-09/Elastic3

https://khj93.tistory.com/entry/Database-RDBMS와-NOSQL-차이점

https://steady-coding.tistory.com/573

https://choseongho93.tistory.com/231

https://velog.io/@choi-yh/검색엔진-무신사-검색-추천-시스템-정리