brunch

You can make anything
by writing

C.S.Lewis

by 비즈스프링 Jun 13. 2023

Elasticsearch 사용을 위한 쿼리 생성 과정

이번 포스팅에서는 AIR™(Ad Integrated Report, 매체통합리포트)에서 Elasticsearch를 사용하기 위해 필요한 쿼리 생성 과정에 대해 소개하려고 합니다.


Mysql 테이블 데이터 정보 등은 생략하였으며, 이전 게시물에서 확인하실 수 있습니다.

AIR에서 Elasticsearch를 사용하기 위한 데이터 구성은 어떻게 할까?


쿼리를 생성하기 전에 AJAX를 이용하여 API를 통해 데이터 요청부터 진행하게 됩니다.



※ AJAX란

 JavaScript를 사용한 비동기 통신으로 클라이언트와 서버간에 XML 데이터를 주고받는 기술입니다.

AJAX라는 네트워크 기술을 이용하여 클라이언트에서 서버로 데이터를 요청하고 그에 대한 결과를 돌려받을 수 있습니다.

(간단하게 말하면 서버와 클라이언트(나)와의 통신입니다)





1. API 데이터 요청

위와 같은 AJAX를 이용한 POST방식으로 데이터를 요청하며, 응답 받은 결과에 대해 callback 함수를
사용하여 전달 받고 있습니다.

데이터 요청 시, 필요한 정보에 따라 url, sendData를 별도로 전달하여 사용하고 있습니다.

url에는 사용하고자 하는 리포트 경로, sendData에는 객체 형식으로 파라미터 값들을 전달하게 됩니다.


차원(dimension)은 어떠한 기준으로 데이터들을 생성해야 하는지 알아야 하기 때문에 필수적으로 요청이 되어야 하며, 지표(metrics)는 별도의 요청이 없을 시 정의되어 있는 모든 데이터를 가져오기 때문에 생략되어도 됩니다.



이러한 요청을 실제 확인해보면 아래와 같습니다.





2. 데이터 처리 엔진 선택 및 API 요청 데이터 전달받기

요청받은 URL의 리포트 번호를 통해 mysql에 저장되어 있는 tb_report 테이블의 정보를 찾아 정의되어 있는 db_type에 해당하는 데이터 처리 엔진을 선택하게 됩니다.

(사용하고 있는 데이터 처리 엔진으로는 Elastic, BigQuery 등이 있습니다.)


데이터 처리 엔진마다 전달받아야 하는 데이터 정보가 다르기 때문에, 요청받은 데이터를 파싱하는 작업이 진행됩니다.





3. Elasticsearch 데이터 쿼리 생성

쿼리 생성을 위해 elasticsearch-rest-high-level-client 라이브러리를 사용하고 있습니다.


전달받은 리포트 번호를 통해 mysql에 저장되어 있는 tb_report_part 테이블 정보를 조회해 옵니다.

해당 테이블에는 리포트에서 사용할 수 있는 차원(dimension), 지표(metrics)의 모든 정보가 정의되어 있습니다.


요청되어진 차원(dimension), 지표(metrics) 가 있으면 tb_report_part 테이블에서 해당되는 값들만 추출하여 사용하게 됩니다.




1) BoolQueryBuilder (조건문 생성)

차원과 같은 이름으로 요청되어진 데이터가 있으면 조건문을 생성하는데 사용합니다.

(client_seq, pfno, psDate, peDate 등)


bool쿼리로는 must, must_not, should를 사용하고 있습니다.

– must : 쿼리가 참인 도큐먼트들을 검색합니다.

– must_not : 쿼리가 거짓인 도큐먼트들을 검색합니다.

– should : 검색 결과 중 이 쿼리에 해당하는 도큐먼트의 점수를 높입니다.


SQL의 OR과 정확히 일치하게 동작하는 bool쿼리가 없어 유사한 기능으로 should를 사용합니다.

(should로 아래 이미지의 must, must_not을 배열로 담아 사용합니다.)



표준 SQL과 Elasticsearch Bool 쿼리 비교 (출처: BizSpring)




2) CompositeValuesSourceBuilder (조회 대상 생성)

dimension으로 요청되어진 데이터를 가지고 TermsValuesSourceBuilder를 사용하여 조회 대상을
생성합니다.

tb_dimension 테이블에 있는 data_type을 기준으로 데이터 타입이 정의됩니다.




3) BaseAggregationBuilder (집계 데이터 생성)

metrics로 요청되어진 데이터가 있으면 해당 데이터만, 없으면 전체에 대해 AggregationBuilders를 사용하여 집계 데이터를 생성합니다.


tb_metrics 테이블의 met_option에 있는 Elastic 이라는 키로 되어 있는 value값을 가지고 사용하며 SUM__#__au 와 같이 되어 있으면 __#__ 구분자를 기준으로 앞에 있는 값을 수식, 뒤에 있는 값을 집계에 사용할 데이터로 사용합니다.


수식으로는 SUM, AVG, DIV, CARDINALITY, CNT, DCOUNT, MAX, MIN 를 사용하고 있습니다.


– SUM : 합계

– AVG : 평균

– DIV : 나눗셈

– CARDINALITY : 필드의 값이 모두 몇 종류인지 분포값을 알기 위해 사용

– CNT : 개수

– DCOUNT : 도큐먼트의 개수

– MAX : 최대값

– MIN : 최소값


tb_metrics 테이블에 있는 data_type을 기준으로 데이터 타입이 정의됩니다.




4) 쿼리 생성

대략적으로 1),2),3)에서 처리한 내용을 조합하여 아래와 같은 Builder구문을 사용하여 쿼리를 생성하게 됩니다.

검색을 위해 SearchSourceBuilder를 사용하여 조건이 되는 boolQueryBuilder를 넣고 연산에 사용하는 aggregationBuilder 를 조합하여 생성하게 됩니다.





4. Elasticsearch 쿼리

3. 번과 같은 과정을 거쳐 아래와 같은 Elasticsearch 쿼리가 실행되게 됩니다.




이상으로, BizSpring Growth Platform™️ 에서 Elasticsearch를 사용하기 위해 필요한 쿼리 생성 과정을 함께 알아보았습니다. 비즈스프링의 마케팅 자동화 솔루션 Growth Platform™️에 대해 궁금한 점은 아래 채널로 연락주시기 바랍니다.


감사합니다.



ad@bizspring.co.kr / 02-6919-5516




마케팅에서의 데이터 활용 기술과 인사이트
No.1 Data Partner for Data-Driven Growth
비즈스프링

공식 블로그 | 페이스북 | 네이버 블로그 | 유튜브 | 트위터 | 슬라이드쉐어


매거진의 이전글 GA4 데이터 수집하여 리포트 생성하기
작품 선택
키워드 선택 0 / 3 0
댓글여부
afliean
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari