Source code for django_elasticsearch_dsl_drf.filter_backends.search.multi_match

"""Compound search backend."""
import operator
import logging

from django.core.exceptions import ImproperlyConfigured

import six

from ...constants import MATCHING_OPTION_MUST, MATCHING_OPTIONS
from .base import BaseSearchFilterBackend
from .query_backends import (
    MultiMatchQueryBackend,
)

LOGGER = logging.getLogger(__name__)


__title__ = 'django_elasticsearch_dsl_drf.filter_backends.search.multi_match'
__author__ = 'Artur Barseghyan <artur.barseghyan@gmail.com>'
__copyright__ = '2017-2018 Artur Barseghyan'
__license__ = 'GPL 2.0/LGPL 2.1'
__all__ = (
    'MultiMatchSearchFilterBackend',
)


[docs]class MultiMatchSearchFilterBackend(BaseSearchFilterBackend): """Multi match search filter backend.""" search_param = 'search_multi_match' matching = MATCHING_OPTION_MUST query_backends = [ MultiMatchQueryBackend, ]
[docs] def filter_queryset(self, request, queryset, view): """Filter the queryset. :param request: Django REST framework request. :param queryset: Base queryset. :param view: View. :type request: rest_framework.request.Request :type queryset: elasticsearch_dsl.search.Search :type view: rest_framework.viewsets.ReadOnlyModelViewSet :return: Updated queryset. :rtype: elasticsearch_dsl.search.Search """ if self.matching not in MATCHING_OPTIONS: raise ImproperlyConfigured( "Your `matching` value does not match the allowed matching" "options: {}".format(', '.join(MATCHING_OPTIONS)) ) __queries = [] for query_backend in self._get_query_backends(request, view): __queries.extend( query_backend.construct_search( request=request, view=view, search_backend=self ) ) if __queries: # LOGGER.debug(six.moves.reduce(operator.or_, __queries).to_dict()) # Multiple multi match queries are not supported. We pick the # first one only. queryset = queryset.query(__queries[0]) # queryset = queryset.query( # query=six.moves.reduce(operator.or_, __queries) # ) # LOGGER.debug(queryset.to_dict()) return queryset