Как стать автором
Обновить

Комментарии 14

Чем эта библиотека лучше/хуже чем haystack?
haystack в данный момент не поддерживает Elasticsearch версии 5.x.
НЛО прилетело и опубликовало эту надпись здесь

рабочие бекэнды под пятый эластик есть, использую этот для поиска и mlt

Спасибо за очень полезную статью, хотелось бы побольше таких дайджестов!)
НЛО прилетело и опубликовало эту надпись здесь
Для описание документа как раз используется elasticsearch-dsl. Текущая библиотека позволяет просто преобразовывать django объекты в документы elasticsearch. И использовать elasticsearch с Django REST Framework — ом
Интересено было бы глянуть на ситуацию, когда Blog представлет из себя развесистую сущность с несколькими foreign key.
НЛО прилетело и опубликовало эту надпись здесь
Два варианта переиндексации:
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
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Для Foreign Key нужно использовать ObjectField.
Описание документа
from elasticsearch_dsl import Object
class BlogIndex(DocType):
    pk = Integer()
    ...
    author = Object(
        properties={
            'name': Text(fields={'raw': Keyword()}),
            'pk': Integer(),
        }
    )

Пример сериалайзера
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')

обновление индекса по сигналу хорошо только для тестирования или если сохранения модели редки. в остальных случаях чаще используют очередь фоновых задач, которая запускается по сигналу, как например сделано в celery-haystack и подобных пакетах

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации