class AuthorSerializer(serializers.ModelSerializer):
class Meta:
model = Author
fields = ('pk', 'name')
class ElasticBlogSerializer(ElasticModelSerializer):
author = AuthorSerializer()
class Meta:
model = Blog
es_model = BlogIndex
fields = ('pk', 'title', 'created_at', 'tags', 'body', 'is_published', 'author')
Для описание документа как раз используется elasticsearch-dsl. Текущая библиотека позволяет просто преобразовывать django объекты в документы elasticsearch. И использовать elasticsearch с Django REST Framework — ом
from elasticsearch.client import IndicesClient
from .serializers import Blog, ElasticBlogSerializer
# Удаляем индекс
indices_client = IndicesClient(client=es_client)
if indices_client.exists('blog'):
indices_client.delete(index='blog')
# Вариант 1
# Создаем запись в elasticsearch для каждого объекта
for instance in Blog.object.all().iterator():
obj = ElasticBlogSerializer(instance)
obj.save()
# Вариант 2 c использованием bulk-а
from elasticsearch.helpers import bulk
actions = []
for item in Blog.object.all().iterator():
actions.append(ElasticBlogSerializer.es_repr(item).to_dict(include_meta=True))
bulk(client=es_client, actions=actions)
bulk работает быстрее но учтите что может упасть по timeout-у на AWS
Описание документа
Пример сериалайзера
bulk работает быстрее но учтите что может упасть по timeout-у на AWS