django_elasticsearch_dsl_drf.filter_backends.suggester package

Submodules

django_elasticsearch_dsl_drf.filter_backends.suggester.functional module

Functional suggesters backend.

It’s assumed, that fields you’re planning to query suggestions for have been properly indexed using fields.CompletionField.

Example:

>>> from django_elasticsearch_dsl import Document, Index, fields
>>>
>>> from books.models import Publisher
>>>
>>> # Name of the Elasticsearch index
>>> PUBLISHER_INDEX = Index(PUBLISHER_INDEX_NAME)
>>> # See Elasticsearch Indices API reference for available settings
>>> PUBLISHER_INDEX.settings(
>>>     number_of_shards=1,
>>>     number_of_replicas=1
>>> )
>>>
>>> @PUBLISHER_INDEX.doc_type
>>> class PublisherDocument(Document):
>>>     "Publisher Elasticsearch document."
>>>
>>>     id = fields.IntegerField(attr='id')
>>>
>>>     name = fields.StringField(
>>>         fields={
>>>             'raw': fields.StringField(analyzer='keyword'),
>>>             'suggest': fields.CompletionField(),
>>>         }
>>>     )
>>>
>>>     info = fields.StringField()
>>>
>>>     address = fields.StringField(
>>>         fields={
>>>             'raw': fields.StringField(analyzer='keyword')
>>>         }
>>>     )
>>>
>>>     city = fields.StringField(
>>>         fields={
>>>             'raw': fields.StringField(analyzer='keyword'),
>>>             'suggest': fields.CompletionField(),
>>>         }
>>>     )
>>>
>>>     state_province = fields.StringField(
>>>         fields={
>>>             'raw': fields.StringField(analyzer='keyword'),
>>>             'suggest': fields.CompletionField(),
>>>         }
>>>     )
>>>
>>>     country = fields.StringField(
>>>         fields={
>>>             'raw': fields.StringField(analyzer='keyword'),
>>>             'suggest': fields.CompletionField(),
>>>         }
>>>     )
>>>
>>>     website = fields.StringField()
>>>
>>>     class Meta:
>>>         "Meta options."
>>>
>>>         model = Publisher  # The model associate with this Document
class django_elasticsearch_dsl_drf.filter_backends.suggester.functional.FunctionalSuggesterFilterBackend[source]

Bases: rest_framework.filters.BaseFilterBackend, django_elasticsearch_dsl_drf.filter_backends.mixins.FilterBackendMixin

Suggester filter backend for Elasticsearch.

Suggestion functionality is exclusive. Once you have queried the FunctionalSuggesterFilterBackend, the latter will transform your current search query into another search query (altered). Therefore, always add it as the very last filter backend.

Example:

>>> from django_elasticsearch_dsl_drf.constants import (
>>>     FUNCTIONAL_SUGGESTER_COMPLETION_MATCH,
>>>     FUNCTIONAL_SUGGESTER_COMPLETION_PREFIX,
>>>     FUNCTIONAL_SUGGESTER_PHRASE_MATCH,
>>>     FUNCTIONAL_SUGGESTER_PHRASE_MATCH,
>>>     FUNCTIONAL_SUGGESTER_TERM_MATCH,
>>> )
>>> from django_elasticsearch_dsl_drf.filter_backends import (
>>>     FunctionalSuggesterFilterBackend
>>> )
>>> from django_elasticsearch_dsl_drf.viewsets import DocumentViewSet
>>>
>>> # Local PublisherDocument definition
>>> from .documents import PublisherDocument
>>>
>>> # Local PublisherDocument serializer
>>> from .serializers import PublisherDocumentSerializer
>>>
>>> class PublisherDocumentView(DocumentViewSet):
>>>
>>>     document = PublisherDocument
>>>     serializer_class = PublisherDocumentSerializer
>>>     filter_backends = [
>>>         # ...
>>>         FunctionalSuggesterFilterBackend,
>>>     ]
>>>     # Suggester fields
>>>     functional_suggester_fields = {
>>>         'name_suggest': {
>>>             'field': 'name.suggest',
>>>             'suggesters': [
>>>                 FUNCTIONAL_SUGGESTER_COMPLETION_MATCH,
>>>                 FUNCTIONAL_SUGGESTER_COMPLETION_PREFIX,
>>>             ],
>>>         },
>>>         'city_suggest': {
>>>             'field': 'city.suggest',
>>>             'suggesters': [
>>>                 FUNCTIONAL_SUGGESTER_COMPLETION_PREFIX,
>>>             ],
>>>         },
>>>         'state_province_suggest': {
>>>             'field': 'state_province.suggest',
>>>             'suggesters': [
>>>                 FUNCTIONAL_SUGGESTER_COMPLETION_MATCH,
>>>             ],
>>>         },
>>>         'country_suggest': {
>>>             'field': 'country.suggest',
>>>             'suggesters': [
>>>                 FUNCTIONAL_SUGGESTER_COMPLETION_PREFIX,
>>>             ],
>>>         },
>>>     }
classmethod apply_query_size(queryset, options)[source]

Apply query size.

Parameters
  • queryset

  • options

Returns

classmethod apply_suggester_completion_match(suggester_name, queryset, options, value)[source]

Apply completion suggester match.

This is effective when used with Ngram fields.

Parameters
  • suggester_name (str) –

  • queryset (elasticsearch_dsl.search.Search) – Original queryset.

  • options (dict) – Filter options.

  • value (str) – value to filter on.

Returns

Modified queryset.

Return type

elasticsearch_dsl.search.Search

classmethod apply_suggester_completion_prefix(suggester_name, queryset, options, value)[source]

Apply completion suggester prefix.

This is effective when used with Keyword fields.

Parameters
  • suggester_name (str) –

  • queryset (elasticsearch_dsl.search.Search) – Original queryset.

  • options (dict) – Filter options.

  • value (str) – value to filter on.

Returns

Modified queryset.

Return type

elasticsearch_dsl.search.Search

clean_queryset(queryset)[source]

Clean the queryset.

  • Remove aggregations.

  • Remove highlight.

  • Remove sorting options.

Parameters

queryset

Returns

extract_field_name(field_name)[source]

Extract field name.

For instance, “name.suggest” or “name.raw” becomes “name”.

Parameters

field_name

Returns

Return type

str

filter_queryset(request, queryset, view)[source]

Filter the queryset.

Parameters
  • request (rest_framework.request.Request) – Django REST framework request.

  • queryset (elasticsearch_dsl.search.Search) – Base queryset.

  • view (rest_framework.viewsets.ReadOnlyModelViewSet) – View.

Returns

Updated queryset.

Return type

elasticsearch_dsl.search.Search

get_suggester_query_params(request, view)[source]

Get query params to be for suggestions.

Parameters
  • request (rest_framework.request.Request) – Django REST framework request.

  • view (rest_framework.viewsets.ReadOnlyModelViewSet) – View.

Returns

Request query params to filter on.

Return type

dict

classmethod prepare_suggester_fields(view)[source]

Prepare filter fields.

Parameters

view (rest_framework.viewsets.ReadOnlyModelViewSet) –

Returns

Filtering options.

Return type

dict

serialize_queryset(queryset, suggester_name, value, serializer_field)[source]

Serialize queryset.

This shall be done here, since we don’t want to delegate it to pagination.

Parameters
  • queryset

  • suggester_name

  • value

  • serializer_field

Returns

django_elasticsearch_dsl_drf.filter_backends.suggester.native module

Suggesters backend.

It’s assumed, that fields you’re planning to query suggestions for have been properly indexed using fields.CompletionField.

Example:

>>> from django_elasticsearch_dsl import Document, Index, fields
>>>
>>> from books.models import Publisher
>>>
>>> # Name of the Elasticsearch index
>>> PUBLISHER_INDEX = Index(PUBLISHER_INDEX_NAME)
>>> # See Elasticsearch Indices API reference for available settings
>>> PUBLISHER_INDEX.settings(
>>>     number_of_shards=1,
>>>     number_of_replicas=1
>>> )
>>>
>>> @PUBLISHER_INDEX.doc_type
>>> class PublisherDocument(Document):
>>>     "Publisher Elasticsearch document."
>>>
>>>     id = fields.IntegerField(attr='id')
>>>
>>>     name = fields.StringField(
>>>         fields={
>>>             'raw': fields.StringField(analyzer='keyword'),
>>>             'suggest': fields.CompletionField(),
>>>         }
>>>     )
>>>
>>>     info = fields.StringField()
>>>
>>>     address = fields.StringField(
>>>         fields={
>>>             'raw': fields.StringField(analyzer='keyword')
>>>         }
>>>     )
>>>
>>>     city = fields.StringField(
>>>         fields={
>>>             'raw': fields.StringField(analyzer='keyword'),
>>>             'suggest': fields.CompletionField(),
>>>         }
>>>     )
>>>
>>>     state_province = fields.StringField(
>>>         fields={
>>>             'raw': fields.StringField(analyzer='keyword'),
>>>             'suggest': fields.CompletionField(),
>>>         }
>>>     )
>>>
>>>     country = fields.StringField(
>>>         fields={
>>>             'raw': fields.StringField(analyzer='keyword'),
>>>             'suggest': fields.CompletionField(),
>>>         }
>>>     )
>>>
>>>     website = fields.StringField()
>>>
>>>     class Meta:
>>>         "Meta options."
>>>
>>>         model = Publisher  # The model associate with this Document
class django_elasticsearch_dsl_drf.filter_backends.suggester.native.SuggesterFilterBackend[source]

Bases: rest_framework.filters.BaseFilterBackend, django_elasticsearch_dsl_drf.filter_backends.mixins.FilterBackendMixin

Suggester filter backend for Elasticsearch.

Suggestion functionality is exclusive. Once you have queried the SuggesterFilterBackend, the latter will transform your current search query into suggestion search query (which is very different). Therefore, always add it as the very last filter backend.

Example:

>>> from django_elasticsearch_dsl_drf.constants import (
>>>     SUGGESTER_TERM,
>>>     SUGGESTER_PHRASE,
>>>     SUGGESTER_COMPLETION,
>>> )
>>> from django_elasticsearch_dsl_drf.filter_backends import (
>>>     SuggesterFilterBackend
>>> )
>>> from django_elasticsearch_dsl_drf.viewsets import DocumentViewSet
>>>
>>> # Local PublisherDocument definition
>>> from .documents import PublisherDocument
>>>
>>> # Local PublisherDocument serializer
>>> from .serializers import PublisherDocumentSerializer
>>>
>>> class PublisherDocumentView(BaseDocumentViewSet):
>>>
>>>     document = PublisherDocument
>>>     serializer_class = PublisherDocumentSerializer
>>>     filter_backends = [
>>>         # ...
>>>         SuggesterFilterBackend,
>>>     ]
>>>     # Suggester fields
>>>     suggester_fields = {
>>>         'name_suggest': {
>>>             'field': 'name.suggest',
>>>             'suggesters': [
>>>                 SUGGESTER_TERM,
>>>                 SUGGESTER_PHRASE,
>>>                 SUGGESTER_COMPLETION,
>>>             ],
>>>         },
>>>         'city_suggest': {
>>>             'field': 'city.suggest',
>>>             'suggesters': [
>>>                 SUGGESTER_COMPLETION,
>>>             ],
>>>         },
>>>         'state_province_suggest': {
>>>             'field': 'state_province.suggest',
>>>             'suggesters': [
>>>                 SUGGESTER_COMPLETION,
>>>             ],
>>>         },
>>>         'country_suggest': {
>>>             'field': 'country.suggest',
>>>             'suggesters': [
>>>                 SUGGESTER_COMPLETION,
>>>             ],
>>>         },
>>>     }
classmethod apply_suggester_completion(suggester_name, queryset, options, value)[source]

Apply completion suggester.

Parameters
  • suggester_name (str) –

  • queryset (elasticsearch_dsl.search.Search) – Original queryset.

  • options (dict) – Filter options.

  • value (str) – value to filter on.

Returns

Modified queryset.

Return type

elasticsearch_dsl.search.Search

classmethod apply_suggester_phrase(suggester_name, queryset, options, value)[source]

Apply phrase suggester.

Parameters
  • suggester_name (str) –

  • queryset (elasticsearch_dsl.search.Search) – Original queryset.

  • options (dict) – Filter options.

  • value (str) – value to filter on.

Returns

Modified queryset.

Return type

elasticsearch_dsl.search.Search

classmethod apply_suggester_term(suggester_name, queryset, options, value)[source]

Apply term suggester.

Parameters
  • suggester_name (str) –

  • queryset (elasticsearch_dsl.search.Search) – Original queryset.

  • options (dict) – Filter options.

  • value (str) – value to filter on.

Returns

Modified queryset.

Return type

elasticsearch_dsl.search.Search

filter_queryset(request, queryset, view)[source]

Filter the queryset.

Parameters
  • request (rest_framework.request.Request) – Django REST framework request.

  • queryset (elasticsearch_dsl.search.Search) – Base queryset.

  • view (rest_framework.viewsets.ReadOnlyModelViewSet) – View.

Returns

Updated queryset.

Return type

elasticsearch_dsl.search.Search

classmethod get_suggester_context(field, suggester_name, request, view)[source]

Get suggester context.

Given the following definition (in ViewSets):

>>> # Suggester fields
>>> suggester_fields = {
>>>     'title_suggest': {
>>>         'field': 'title.suggest',
>>>         'default_suggester': SUGGESTER_COMPLETION,
>>>     },
>>>     'title_suggest_context': {
>>>         'field': 'title.suggest_context',
>>>         'default_suggester': SUGGESTER_COMPLETION,
>>>         'completion_options': {
>>>             'filters': {
>>>                 'title_suggest_tag': 'tag',
>>>                 'title_suggest_state': 'state',
>>>                 'title_suggest_publisher': 'publisher',
>>>             },
>>>             'size': 10,
>>>         }
>>>     },
>>> }

http://localhost:8000/search/books-frontend/suggest/?title_suggest_context=M

When talking about the queries made, we have the following. Multiple values per field are combined with OR:

>>> completion={
>>>     'field': options['field'],
>>>     'size': 10,
>>>     'contexts': {
>>>         'tag': ['History', 'Drama'],
>>>     }
>>> }

The following works with OR as well, so it seems we have OR only. However, the following construction is more handy, since it allows us to play with boosting nicely. Also, it allows to provide prefix param (which in case of the example given below means that suggestions shall match both categories with “Child”, “Children”, “Childrend’s”). Simply put it’s treated as prefix, rather than term.

>>> completion={
>>>     'field': options['field'],
>>>     'size': 10,
>>>     'contexts': {
>>>         'tag': [
>>>             {'context': 'History'},
>>>             {'context': 'Drama', 'boost': 2},
>>>             {'context': 'Children', 'prefix': True},
>>>         ],
>>>     },
>>> }

Sample query for category filter:

/search/books-frontend/suggest/ ?title_suggest_context=M &title_suggest_tag=Art__2.0 &title_suggest_tag=Documentary__2.0__prefix &title_suggest_publisher=Apress

The query params would be:

query_params: <QueryDict: {

‘title_suggest_context’: [‘M’], ‘title_suggest_tag’: [‘Art__2.0’, ‘Documentary__2.0__prefix’], ‘title_suggest_publisher’: [‘Apress’]

}>

Sample query for geo filter:

/search/address/suggest/ ?street_suggest_context=M &street_suggest_loc=43.66__-79.22__2.0__10000km

The query params would be:

query_params: <QueryDict: {

‘street_suggest_context’: [‘M’], ‘street_suggest_loc’: [‘Art__43.66__-79.22__2.0__10000km’],

}>

Returns

get_suggester_query_params(request, view)[source]

Get query params to be for suggestions.

Parameters
  • request (rest_framework.request.Request) – Django REST framework request.

  • view (rest_framework.viewsets.ReadOnlyModelViewSet) – View.

Returns

Request query params to filter on.

Return type

dict

classmethod prepare_suggester_fields(view)[source]

Prepare filter fields.

Parameters

view (rest_framework.viewsets.ReadOnlyModelViewSet) –

Returns

Filtering options.

Return type

dict

Module contents

Suggester filtering backends.

class django_elasticsearch_dsl_drf.filter_backends.suggester.FunctionalSuggesterFilterBackend[source]

Bases: rest_framework.filters.BaseFilterBackend, django_elasticsearch_dsl_drf.filter_backends.mixins.FilterBackendMixin

Suggester filter backend for Elasticsearch.

Suggestion functionality is exclusive. Once you have queried the FunctionalSuggesterFilterBackend, the latter will transform your current search query into another search query (altered). Therefore, always add it as the very last filter backend.

Example:

>>> from django_elasticsearch_dsl_drf.constants import (
>>>     FUNCTIONAL_SUGGESTER_COMPLETION_MATCH,
>>>     FUNCTIONAL_SUGGESTER_COMPLETION_PREFIX,
>>>     FUNCTIONAL_SUGGESTER_PHRASE_MATCH,
>>>     FUNCTIONAL_SUGGESTER_PHRASE_MATCH,
>>>     FUNCTIONAL_SUGGESTER_TERM_MATCH,
>>> )
>>> from django_elasticsearch_dsl_drf.filter_backends import (
>>>     FunctionalSuggesterFilterBackend
>>> )
>>> from django_elasticsearch_dsl_drf.viewsets import DocumentViewSet
>>>
>>> # Local PublisherDocument definition
>>> from .documents import PublisherDocument
>>>
>>> # Local PublisherDocument serializer
>>> from .serializers import PublisherDocumentSerializer
>>>
>>> class PublisherDocumentView(DocumentViewSet):
>>>
>>>     document = PublisherDocument
>>>     serializer_class = PublisherDocumentSerializer
>>>     filter_backends = [
>>>         # ...
>>>         FunctionalSuggesterFilterBackend,
>>>     ]
>>>     # Suggester fields
>>>     functional_suggester_fields = {
>>>         'name_suggest': {
>>>             'field': 'name.suggest',
>>>             'suggesters': [
>>>                 FUNCTIONAL_SUGGESTER_COMPLETION_MATCH,
>>>                 FUNCTIONAL_SUGGESTER_COMPLETION_PREFIX,
>>>             ],
>>>         },
>>>         'city_suggest': {
>>>             'field': 'city.suggest',
>>>             'suggesters': [
>>>                 FUNCTIONAL_SUGGESTER_COMPLETION_PREFIX,
>>>             ],
>>>         },
>>>         'state_province_suggest': {
>>>             'field': 'state_province.suggest',
>>>             'suggesters': [
>>>                 FUNCTIONAL_SUGGESTER_COMPLETION_MATCH,
>>>             ],
>>>         },
>>>         'country_suggest': {
>>>             'field': 'country.suggest',
>>>             'suggesters': [
>>>                 FUNCTIONAL_SUGGESTER_COMPLETION_PREFIX,
>>>             ],
>>>         },
>>>     }
classmethod apply_query_size(queryset, options)[source]

Apply query size.

Parameters
  • queryset

  • options

Returns

classmethod apply_suggester_completion_match(suggester_name, queryset, options, value)[source]

Apply completion suggester match.

This is effective when used with Ngram fields.

Parameters
  • suggester_name (str) –

  • queryset (elasticsearch_dsl.search.Search) – Original queryset.

  • options (dict) – Filter options.

  • value (str) – value to filter on.

Returns

Modified queryset.

Return type

elasticsearch_dsl.search.Search

classmethod apply_suggester_completion_prefix(suggester_name, queryset, options, value)[source]

Apply completion suggester prefix.

This is effective when used with Keyword fields.

Parameters
  • suggester_name (str) –

  • queryset (elasticsearch_dsl.search.Search) – Original queryset.

  • options (dict) – Filter options.

  • value (str) – value to filter on.

Returns

Modified queryset.

Return type

elasticsearch_dsl.search.Search

clean_queryset(queryset)[source]

Clean the queryset.

  • Remove aggregations.

  • Remove highlight.

  • Remove sorting options.

Parameters

queryset

Returns

extract_field_name(field_name)[source]

Extract field name.

For instance, “name.suggest” or “name.raw” becomes “name”.

Parameters

field_name

Returns

Return type

str

filter_queryset(request, queryset, view)[source]

Filter the queryset.

Parameters
  • request (rest_framework.request.Request) – Django REST framework request.

  • queryset (elasticsearch_dsl.search.Search) – Base queryset.

  • view (rest_framework.viewsets.ReadOnlyModelViewSet) – View.

Returns

Updated queryset.

Return type

elasticsearch_dsl.search.Search

get_suggester_query_params(request, view)[source]

Get query params to be for suggestions.

Parameters
  • request (rest_framework.request.Request) – Django REST framework request.

  • view (rest_framework.viewsets.ReadOnlyModelViewSet) – View.

Returns

Request query params to filter on.

Return type

dict

classmethod prepare_suggester_fields(view)[source]

Prepare filter fields.

Parameters

view (rest_framework.viewsets.ReadOnlyModelViewSet) –

Returns

Filtering options.

Return type

dict

serialize_queryset(queryset, suggester_name, value, serializer_field)[source]

Serialize queryset.

This shall be done here, since we don’t want to delegate it to pagination.

Parameters
  • queryset

  • suggester_name

  • value

  • serializer_field

Returns

class django_elasticsearch_dsl_drf.filter_backends.suggester.SuggesterFilterBackend[source]

Bases: rest_framework.filters.BaseFilterBackend, django_elasticsearch_dsl_drf.filter_backends.mixins.FilterBackendMixin

Suggester filter backend for Elasticsearch.

Suggestion functionality is exclusive. Once you have queried the SuggesterFilterBackend, the latter will transform your current search query into suggestion search query (which is very different). Therefore, always add it as the very last filter backend.

Example:

>>> from django_elasticsearch_dsl_drf.constants import (
>>>     SUGGESTER_TERM,
>>>     SUGGESTER_PHRASE,
>>>     SUGGESTER_COMPLETION,
>>> )
>>> from django_elasticsearch_dsl_drf.filter_backends import (
>>>     SuggesterFilterBackend
>>> )
>>> from django_elasticsearch_dsl_drf.viewsets import DocumentViewSet
>>>
>>> # Local PublisherDocument definition
>>> from .documents import PublisherDocument
>>>
>>> # Local PublisherDocument serializer
>>> from .serializers import PublisherDocumentSerializer
>>>
>>> class PublisherDocumentView(BaseDocumentViewSet):
>>>
>>>     document = PublisherDocument
>>>     serializer_class = PublisherDocumentSerializer
>>>     filter_backends = [
>>>         # ...
>>>         SuggesterFilterBackend,
>>>     ]
>>>     # Suggester fields
>>>     suggester_fields = {
>>>         'name_suggest': {
>>>             'field': 'name.suggest',
>>>             'suggesters': [
>>>                 SUGGESTER_TERM,
>>>                 SUGGESTER_PHRASE,
>>>                 SUGGESTER_COMPLETION,
>>>             ],
>>>         },
>>>         'city_suggest': {
>>>             'field': 'city.suggest',
>>>             'suggesters': [
>>>                 SUGGESTER_COMPLETION,
>>>             ],
>>>         },
>>>         'state_province_suggest': {
>>>             'field': 'state_province.suggest',
>>>             'suggesters': [
>>>                 SUGGESTER_COMPLETION,
>>>             ],
>>>         },
>>>         'country_suggest': {
>>>             'field': 'country.suggest',
>>>             'suggesters': [
>>>                 SUGGESTER_COMPLETION,
>>>             ],
>>>         },
>>>     }
classmethod apply_suggester_completion(suggester_name, queryset, options, value)[source]

Apply completion suggester.

Parameters
  • suggester_name (str) –

  • queryset (elasticsearch_dsl.search.Search) – Original queryset.

  • options (dict) – Filter options.

  • value (str) – value to filter on.

Returns

Modified queryset.

Return type

elasticsearch_dsl.search.Search

classmethod apply_suggester_phrase(suggester_name, queryset, options, value)[source]

Apply phrase suggester.

Parameters
  • suggester_name (str) –

  • queryset (elasticsearch_dsl.search.Search) – Original queryset.

  • options (dict) – Filter options.

  • value (str) – value to filter on.

Returns

Modified queryset.

Return type

elasticsearch_dsl.search.Search

classmethod apply_suggester_term(suggester_name, queryset, options, value)[source]

Apply term suggester.

Parameters
  • suggester_name (str) –

  • queryset (elasticsearch_dsl.search.Search) – Original queryset.

  • options (dict) – Filter options.

  • value (str) – value to filter on.

Returns

Modified queryset.

Return type

elasticsearch_dsl.search.Search

filter_queryset(request, queryset, view)[source]

Filter the queryset.

Parameters
  • request (rest_framework.request.Request) – Django REST framework request.

  • queryset (elasticsearch_dsl.search.Search) – Base queryset.

  • view (rest_framework.viewsets.ReadOnlyModelViewSet) – View.

Returns

Updated queryset.

Return type

elasticsearch_dsl.search.Search

classmethod get_suggester_context(field, suggester_name, request, view)[source]

Get suggester context.

Given the following definition (in ViewSets):

>>> # Suggester fields
>>> suggester_fields = {
>>>     'title_suggest': {
>>>         'field': 'title.suggest',
>>>         'default_suggester': SUGGESTER_COMPLETION,
>>>     },
>>>     'title_suggest_context': {
>>>         'field': 'title.suggest_context',
>>>         'default_suggester': SUGGESTER_COMPLETION,
>>>         'completion_options': {
>>>             'filters': {
>>>                 'title_suggest_tag': 'tag',
>>>                 'title_suggest_state': 'state',
>>>                 'title_suggest_publisher': 'publisher',
>>>             },
>>>             'size': 10,
>>>         }
>>>     },
>>> }

http://localhost:8000/search/books-frontend/suggest/?title_suggest_context=M

When talking about the queries made, we have the following. Multiple values per field are combined with OR:

>>> completion={
>>>     'field': options['field'],
>>>     'size': 10,
>>>     'contexts': {
>>>         'tag': ['History', 'Drama'],
>>>     }
>>> }

The following works with OR as well, so it seems we have OR only. However, the following construction is more handy, since it allows us to play with boosting nicely. Also, it allows to provide prefix param (which in case of the example given below means that suggestions shall match both categories with “Child”, “Children”, “Childrend’s”). Simply put it’s treated as prefix, rather than term.

>>> completion={
>>>     'field': options['field'],
>>>     'size': 10,
>>>     'contexts': {
>>>         'tag': [
>>>             {'context': 'History'},
>>>             {'context': 'Drama', 'boost': 2},
>>>             {'context': 'Children', 'prefix': True},
>>>         ],
>>>     },
>>> }

Sample query for category filter:

/search/books-frontend/suggest/ ?title_suggest_context=M &title_suggest_tag=Art__2.0 &title_suggest_tag=Documentary__2.0__prefix &title_suggest_publisher=Apress

The query params would be:

query_params: <QueryDict: {

‘title_suggest_context’: [‘M’], ‘title_suggest_tag’: [‘Art__2.0’, ‘Documentary__2.0__prefix’], ‘title_suggest_publisher’: [‘Apress’]

}>

Sample query for geo filter:

/search/address/suggest/ ?street_suggest_context=M &street_suggest_loc=43.66__-79.22__2.0__10000km

The query params would be:

query_params: <QueryDict: {

‘street_suggest_context’: [‘M’], ‘street_suggest_loc’: [‘Art__43.66__-79.22__2.0__10000km’],

}>

Returns

get_suggester_query_params(request, view)[source]

Get query params to be for suggestions.

Parameters
  • request (rest_framework.request.Request) – Django REST framework request.

  • view (rest_framework.viewsets.ReadOnlyModelViewSet) – View.

Returns

Request query params to filter on.

Return type

dict

classmethod prepare_suggester_fields(view)[source]

Prepare filter fields.

Parameters

view (rest_framework.viewsets.ReadOnlyModelViewSet) –

Returns

Filtering options.

Return type

dict