# Django Elasticsearch DSL

***

**1. Create an Index**

```python
from django_elasticsearch_dsl import Document, Index, fields

class Article(Document):
    title = fields.TextField()
    content = fields.TextField()

    class Index:
        name = 'articles'
```

**2. Serializing a Django Model**

```python
class ArticleSerializer(serializers.ModelSerializer):
    class Meta:
        model = Article
        fields = ['id', 'title', 'content']
```

**3. Search using DSL**

```python
from django_elasticsearch_dsl import search

search.index('articles').query("match", title="Django")
```

**4. Filter Results**

```python
from django_elasticsearch_dsl import filters

search.index('articles').query("match", title="Django").filter("range", published_date={"gte": "2020-01-01", "lte": "2020-12-31"})
```

**5. Pagination**

```python
from django_elasticsearch_dsl import paginate

results = search.index('articles').query("match", title="Django").paginate(page=2, per_page=10)
```

**6. Faceting**

```python
from django_elasticsearch_dsl import facets

faceted_search = search.index('articles').query("match", title="Django").facet("category").facet("author")
```

**7. Aggregations**

```python
from django_elasticsearch_dsl import aggregations

aggs = search.index('articles').query("match", title="Django").aggs.bucket("popular_authors", "terms", field="author")
```

**8. Completion Suggester**

```python
from django_elasticsearch_dsl import completion

completion.Completion(name="suggest").field('title')
```

**9. Synonym Filter**

```python
from django_elasticsearch_dsl import synonyms

synonyms.SynonymFilter(name="synonyms", synonyms=["django", "framework"])
```

**10. Geo Distance**

```python
from django_elasticsearch_dsl import geo_distance

search.index('articles').query("geo_distance", location={"lat": 41.88, "lon": -87.62}, distance="10km")
```

**11. Create Index Template**

```python
from django_elasticsearch_dsl import IndexTemplate

template = IndexTemplate(
    name="my_template",
    patterns=["*"],
    settings={
        "number_of_shards": 1,
        "number_of_replicas": 1
    }
)
```

**12. Define a Search Index**

```python
from django_elasticsearch_dsl import Index

index = Index(name='my_index')
```

**13. Index a Django Model**

```python
from django_elasticsearch_dsl import Document

class Article(Document):
    title = fields.TextField()
    content = fields.TextField()

    class Index:
        name = 'my_index'
```

**14. Search Documents**

```python
from django_elasticsearch_dsl import search

search.index('my_index').query("match", title="foo")
```

**15. Create an Autocomplete Index**

```python
from django_elasticsearch_dsl import Completion

completion = Completion(name='autocomplete')
```

**16. Add a Suggester to a Field**

```python
from django_elasticsearch_dsl import Document, TextField, Completion

class Article(Document):
    title = TextField(
        analyzer='standard',
        fields={
            'autocomplete': Completion()
        }
    )
```

**17. Add a Mapping to a Field**

```python
from django_elasticsearch_dsl import Document, TextField

class Article(Document):
    title = TextField(
        analyzer='snowball',
        fields={
            'autocomplete': {
                'type': 'completion',
                'analyzer': 'standard'
            }
        }
    )
```

**18. Index a Model with Multimatch Query**

```python
from django_elasticsearch_dsl import Document, fields

class Article(Document):
    title = fields.TextField()
    content = fields.TextField()
    author = fields.ObjectField(properties={
        'name': fields.TextField()
    })

    class Index:
        name = 'my_index'

    def get_queryset(self):
        qs = super(Article, self).get_queryset()
        return qs.order_by('-created')
```

**19. Index a Model with Filtering**

```python
from django_elasticsearch_dsl import Document, fields

class Article(Document):
    title = fields.TextField()
    content = fields.TextField()
    author = fields.ObjectField(properties={
        'name': fields.TextField()
    })

    class Index:
        name = 'my_index'

    def get_queryset(self):
        qs = super(Article, self).get_queryset()
        return qs.filter(author__name='John Doe')
```

**20. Index a Model with Sorting**

```python
from django_elasticsearch_dsl import Document, fields

class Article(Document):
    title = fields.TextField()
    content = fields.TextField()
    author = fields.ObjectField(properties={
        'name': fields.TextField()
    })

    class Index:
        name = 'my_index'

    def get_queryset(self):
        qs = super(Article, self).get_queryset()
        return qs.order_by('created')
```

**21. Create an Index with Custom Analyzer**

```python
from django_elasticsearch_dsl import Index, Document, TextField

class ArticleIndex(Index):
    name = 'articles'

    settings = {
        "analysis": {
            "analyzer": {
                "my_analyzer": {
                    "tokenizer": "standard",
                    "filter": ["lowercase", "stop"]
                }
            }
        }
    }

class Article(Document):
    title = TextField(analyzer='my_analyzer')

    class Index:
        name = 'articles'
```

**22. Create an Index with Custom Tokenizer**

```python
from django_elasticsearch_dsl import Index, Document, TextField

class ArticleIndex(Index):
    name = 'articles'

    settings = {
        "analysis": {
            "tokenizer": {
                "my_tokenizer": {
                    "type": "nGram",
                    "min_gram": 2,
                    "max_gram": 3
                }
            }
        }
    }

class Article(Document):
    title = TextField(tokenizer='my_tokenizer')

    class Index:
        name = 'articles'
```

**23. Create an Index with Custom Filter**

```python
from django_elasticsearch_dsl import Index, Document, TextField

class ArticleIndex(Index):
    name = 'articles'

    settings = {
        "analysis": {
            "filter": {
                "my_filter": {
                    "type": "length",
                    "min": 3
                }
            }
        }
    }

class Article(Document):
    title = TextField(filter='my_filter')

    class Index:
        name = 'articles'
```

**24. Create an Index with Custom Char Filter**

```python
from django_elasticsearch_dsl import Index, Document, TextField

class ArticleIndex(Index):
    name = 'articles'

    settings = {
        "analysis": {
            "char_filter": {
                "my_char_filter": {
                    "type": "mapping",
                    "mappings": [
                        "e => a"
                    ]
                }
            }
        }
    }

class Article(Document):
    title = TextField(char_filter='my_char_filter')

    class Index:
        name = 'articles'
```

**25. Create an Index with Custom Token Filter**

```python
from django_elasticsearch_dsl import Index, Document, TextField

class ArticleIndex(Index):
    name = 'articles'

    settings = {
        "analysis": {
            "token_filter": {
                "my_token_filter": {
                    "type": "length",
                    "min": 3
                }
            }
        }
    }

class Article(Document):
    title = TextField(token_filter='my_token_filter')

    class Index:
        name = 'articles'
```

**26. Create an Index with Custom Synonym Filter**

```python
from django_elasticsearch_dsl import Index, Document, TextField

class ArticleIndex(Index):
    name = 'articles'

    settings = {
        "analysis": {
            "filter": {
                "my_synonym_filter": {
                    "type": "synonym",
                    "synonyms": [
                        "python, java"
                    ]
                }
            }
        }
    }

class Article(Document):
    title = TextField(filter='my_synonym_filter')

    class Index:
        name = 'articles'
```

**27. Create an Index with Custom Edge Ngram Tokenizer**

```python
from django_elasticsearch_dsl import Index, Document, TextField

class ArticleIndex(Index):
    name = 'articles'

    settings = {
        "analysis": {
            "tokenizer": {
                "my_edge_ngram_tokenizer": {
                    "type": "edge_ngram",
                    "min_gram": 2,
                    "max_gram": 3
                }
            }
        }
    }

class Article(Document):
    title = TextField(tokenizer='my_edge_ngram_tokenizer')

    class Index:
        name = 'articles'

```
