django-el

Django elasticsearch integration.


Keywords
django, elasticsearch
License
MIT
Install
pip install django-el==0.2.2

Documentation

This is Django application that helps intergrate Django with elasticsearch. It is built on top of elasticsearch-dsl.


3.x pypi MIT License


Overview

Project aims to support Python 3 and Django 1.8 (at least).

The library is in development, use it carefully, because until stable an API is a subject to change.

The library supports indexing multiple models with el.models.Indexed mixin. Such models are autodiscovered and indexed automatically with an update_index command.

Currently you can query only one type of models, only Article, or BlogPost, for example. The library is just just a thin integration layer of elasticsearch-dsl and django, because former comes with other persisting layer (a DocType one).

If you want to query multiple models at once, you can use raw elasticsearch-dsl query and then cast documents to models using elasticsearch document meta information (model content_type and pk).

The library was written as an experiment, inspired by django-wagtail, so it provides just a basic functionality.

If you feel happy with elasticsearch-dsl, this library might suit your needs. If you are not, then maybe it is better idea to use django-haystack + elasticstack.

Feel free to contribute and improve, if you feel you need it :)

Quickstart

Configure your models to be indexable:

from django.db import models
from el.models import Indexed

class Article(models.Model, Indexed):
    title = models.CharField(max_length=78)

    @classmethod
    def get_indexable(cls):
        return cls.objects.all()

    @classmethod
    def configure_mapping(cls, mapping):
        # mapping is an elasticsearch_dsl Mapping object
        mapping.field('title', 'string')
        return mapping

From this moment, the Article model will be autodiscovered and indexed.

Update search indexes:

./manage.py update_index

Use elasticsearch_dsl to query:

# articles is a list of an Article instances
articles = Article.search().query('match', title="Bob's article").execute()

# articles is a list of elasticsearch_dsl hits
articles = Article.search().query('match', title="Bob's article").execute(cast=False)

In contrast with elasticsearch_dsl, django-el provides modified Search object which return django model instances instead of raw elasticsearch results by default. You can control this feature using the cast argument.

Installation

Install django-el as usual python package using pip:

pip install django-el

Configuration

Django-el is build on top of elasticsearch_dsl library and provides django-way connections configuration through settings.py:

ELASTICSEARCH_CONNECTIONS = {
    'default': {
        'hosts': ['127.0.0.1:9200'],
        'serializer': 'project.serializers.MySerializer',
    }
}

You can define project connections using ELASTICSEARCH_CONNECTIONS setting. It is just a hight-level interface over low-level elasticsearch_dsl.connections.connections.create_connection function.

The keys are (default, in this example) are connection aliases, and it's values are create_connection arguments.