Django-DSL 동적 INDEX 생성

category 백엔드/개발 2019. 2. 3. 15:47
728x90
반응형

환경

  • Python 3.6
  • Django 2.1.1
  • ElasticSearch 3.6.x

 

요약

Django와 ElasticSearch을 연동해서 사용 중이다. 이번달은 LOG_201901, 다음달은 LOG_201902 ...으로 동적으로 INDEX (RDB 용어로는 테이블)을 생성하여 사용하고 싶다. ORM(Model)의 Meta 정보에 넣었으나 코드를 넣었으나 INDEX가 날짜별로 자동 생성되지 않고 처음 생성된 INDEX(예) LOG_201901) 에만 계속 쌓이는 문제가 있었다.

 

실행한 model 소스는 아래와 같다. 무엇이 문제일까?

from elasticsearch_dsl import DocType, Text, Integer, Date
import datetime

class Statistics(DocType):

    mall_id = Text()
    uuid = Text()
    created_time_at = Date()

    class Meta:
	today = datetime.datetime.today().strftime('%Y%m')

        # 동적 인덱스 생성
        index = 'log_%s' % today

 

이유는 간단하다. Meta에 설정된 INDEX는 한 번 로딩이 되고나면 Runtime시에는 호출을 하지 않는다.

아래와 같이 바꿔주자

 

대응

대응은 간단하다. save, search 등 상속 메소드를 extend하여 INDEX를 동적으로 바꿔주는 코드를 앞단에 넣어주는 것이다.

from elasticsearch_dsl import DocType, Text, Integer, Date
import datetime


def get_index_name():
    today = datetime.datetime.today().strftime('%Y%m')
    return 'log_%s' % today


class Statistics(DocType):

    mall_id = Text()
    uuid = Text()
    created_time_at = Date()

    class Meta:
        index = get_index_name()
    

    def save(self, **kwargs):
        # dynamic index change (인덱스 이름 변경)
        setattr(self.meta, 'index', get_index_name())
        return super(Statistics, self).save(**kwargs)

 

 

728x90
반응형