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 쿼리셋으로 변환하여 반환합니다.
참고 자료
- Django-elasticsearch-dsl 공식문서: https://django-elasticsearch-dsl.readthedocs.io/
- Elasticsearch 공식문서: https://www.elastic.co/guide/index.html