Pull to refresh
8
0
Yaroslav @myarik

Software Engineer

Send message
Для 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')
Для описание документа как раз используется 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
haystack в данный момент не поддерживает Elasticsearch версии 5.x.

Information

Rating
Does not participate
Registered
Activity