본문 바로가기

elastic search

Elastic Search DSL(Aggregation) 사실 ES 에서 이 Aggregation 이 제일 헬이고 핵심이다. 쿼리를 어떤 순서로 짜느냐에 따라서 결과의 depth 도 달라진다. 상당히 애를 많이 먹었기 때문에 머리가 땃땃할 때 정리해 놓는 게 좋다. 일단 Search 객체로 필터링 조건을 정의하고 나면, mysql 로 따졌을 때 WHERE 조건을 정의했다고 보면 된다. 이제 group by, order by 를 해야 되는데 이 부분에 대해 정리해본다. elasticsearh dsl 패키지에서 집계를 위해 A 객체를 제공한다. Q 와 유사한 형태로 A 객체 안에 쿼리 조건을 정의한다. 이 부분이 group by 를 위해 어떤 필드를 select 할 것인가라고 볼 수 있다. search 의 결과에 집계를 이어가고 싶은 경우에는 aggs 키워드를 사.. 더보기
Elastic Search DSL(Search) ES DSL 패키지에서 Search 객체를 활용하면 조건에 맞는 검색 및 집계가 가능하다. ES query 에서 여러가지 조건을 한 번에 만족시키는 쿼리를 구성할 때, bool 이라는 연산자를 사용한다. 마찬가지로 Search 객체에도 query 함수를 사용하여, 연산자와 세부 조건을 Q 라는 객체를 통해 넣을 수 있다. from elasticsearch_dsl import Search, Q s = Search(using=es, index="text-index-v1").query( "bool", filter=[ Q("range", **{"created_dt": {"gte": "2021-01-01", "lte": "2021-02-01"}}), Q("terms", **{"name": ["abc", "bcx".. 더보기
Elastic Search DSL(Connection, Index, Document) 업무적으로 기존 mysql DB 를 통해서 가져오던 데이터를 Elastic search 로 이관하여 쿼리를 재작성해야 하는 일이 생겼다. 사용자가 필터를 통해 선택한 사항에 맞는 데이터를 실시간으로 집계해서 보여줘야 하는 API 였는데, RDB 를 사용하는 경우 테이블 간의 join 이 많다보니 쿼리 수행시간이 오래걸렸다. 그렇다고 DW 를 구축하는 일도 제한적이었다. 사용자가 필터에서 어떤 항목을 선택할 지 알 수 없었기 때문이다. 최초에는 RDB 의 테이블 스키마를 최대한 nosql 처럼 컬럼으로 펼쳤다. join 을 최소화하기 위함이었다. 그럼에도 한계가 있었고, 그 중에서도 특히 시계열 데이터를 표현하는 데에 있어서 특히 어려움이 있었다. 필터에서 날짜 정보가 가장 중요한 필터 요소 중 하나였고,.. 더보기