Only for Django with DRF:
pip install lucyfer
For Django with DRF and Elasticsearch-dsl:
pip install lucyfer[full]
| lucyfer | lucyfer[full] | |
|---|---|---|
| lucyparser | + | + |
| Django | + | + |
| djangorestframework | + | + |
| elasticsearch-dsl | - | + |
Create your search backend class:
from lucyfer.backend import LuceneSearchFilter, DjangoLuceneSearchFilterMixin, ElasticLuceneSearchFilterMixin
class SearchBackend(DjangoLuceneSearchFilterMixin, ElasticLuceneSearchFilterMixin, LuceneSearchFilter):
passCopy reference to SearchBackend class and include it in DEFAULT_FILTER_BACKENDS in settings.py instead of default search backend:
REST_FRAMEWORK = {
'DEFAULT_FILTER_BACKENDS': ('path.to.SearchBackend',)
}Create searchsets.py file in your django-application and fill it:
from lucyfer.searchset import DjangoSearchSet
from lucyfer.searchset.fields.django import DjangoCharField
from .models import MyModel
class MyModelSearchSet(DjangoSearchSet):
some_field = DjangoCharField(sources=["another_field__name"], exclude_sources_from_mapping=True)
class Meta:
model = MyModel
fields_to_exclude_from_mapping = ['field_to_exclude_from_mapping', ]Include searchset class in your ModelViewSet:
from rest_framework.viewsets import ModelViewSet
from .searchsets import MyModelSearchSet
class MyModelViewSet(ModelViewSet):
search_class = MyModelSearchSetYou have to save search_fields in your ModelViewSet if you want to save custom search possibility.
Now you can use lucene-way syntax for your view.
Tests execution:
pytest tests/test_* -c tests/pytest.ini