Комментарии 14
Чем эта библиотека лучше/хуже чем haystack?
Спасибо за очень полезную статью, хотелось бы побольше таких дайджестов!)
НЛО прилетело и опубликовало эту надпись здесь
Интересено было бы глянуть на ситуацию, когда Blog представлет из себя развесистую сущность с несколькими foreign key.
НЛО прилетело и опубликовало эту надпись здесь
Два варианта переиндексации:
bulk работает быстрее но учтите что может упасть по timeout-у на AWS
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 и подобных пакетах
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Поиск в Django REST Framework с помощью Elasticsearch