[python] Django와 Elasticsearch 연동 방법은 어떻게 되는가?

Django는 웹 애플리케이션을 빠르고 쉽게 개발할 수 있는 Python 기반의 프레임워크입니다. Elasticsearch는 분산 검색 및 분석 엔진으로, 데이터 검색과 관련된 다양한 기능을 제공합니다. Django와 Elasticsearch를 연동하여 애플리케이션에서 강력한 검색 기능을 구현할 수 있습니다.

Elasticsearch 설치

Elasticsearch를 설치하기 위해서는 공식 홈페이지(https://www.elastic.co/downloads/elasticsearch)에서 다운로드 받을 수 있습니다. 설치가 완료되면 Elasticsearch를 실행합니다.

Django Elasticsearch 패키지 설치

Django와 Elasticsearch를 연동하기 위해 Elasticsearch 패키지를 설치해야 합니다. 아래의 명령어를 사용하여 패키지를 설치합니다.

pip install django-elasticsearch-dsl

Django 모델과 Elasticsearch 인덱스 정의

Django-elasticsearch-dsl 패키지는 Django 모델과 Elasticsearch 인덱스를 연결하여 데이터를 색인하고 검색하기 위한 기능을 제공합니다. 먼저, Django 모델과 Elasticsearch 인덱스를 정의해야 합니다.

from django.db import models
from django_elasticsearch_dsl import Document, fields
from django_elasticsearch_dsl.registries import registry

class Blog(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()

class BlogDocument(Document):
    title = fields.TextField()
    content = fields.TextField()

    class Index:
        name = 'blog'
        settings = {
            'number_of_shards': 1,
            'number_of_replicas': 1
        }

    class Django:
        model = Blog

위의 코드에서 Blog 모델과 BlogDocument 클래스를 정의하였습니다. BlogDocument 클래스는 Document를 상속하여 Elasticsearch 인덱스와 Django 모델을 연결합니다. Index 클래스에서는 인덱스의 이름과 설정을 정의합니다. Django 클래스에서는 연결할 Django 모델을 지정합니다.

Elasticsearch 인덱스 생성 및 데이터 색인

Django-elasticsearch-dsl 패키지는 Django의 관리자 명령어를 통해 Elasticsearch 인덱스를 생성하고 데이터를 색인할 수 있습니다. 아래의 명령어를 사용하여 인덱스를 생성 및 데이터 색인합니다.

python manage.py search_index --rebuild

검색 기능 구현

검색 기능을 구현하기 위해서는 Elasticsearch에 데이터를 색인한 후, 검색 쿼리를 작성하여 결과를 가져와야 합니다. 아래의 코드는 Blog 모델의 제목과 내용에서 키워드를 검색하는 기능을 구현한 예시입니다.

from elasticsearch import Elasticsearch
from django_elasticsearch_dsl.search import Search

def search_blog(keyword):
    client = Elasticsearch()
    s = Search(using=client, index='blog')
    s = s.query('multi_match', query=keyword, fields=['title', 'content'])
    response = s.execute()

    if response.success():
        return response.to_queryset()
    else:
        return None

위의 코드에서 Elasticsearch 클라이언트를 초기화한 후, Search 클래스를 사용하여 검색 쿼리를 작성합니다. 검색 결과는 response 객체로 반환되며, response.to_queryset() 함수를 통해 Django 쿼리셋으로 변환하여 반환합니다.

참고 자료