Search Provider

When building application with large dataset, it is common to not use your primary storage to search for resources, but rather search through an external indexing service such as ElasticSearch.

MorpFW provides a overrideable search provider API for you to intercept the search mechanism and put your own search logic.

class morpfw.interfaces.ISearchProvider
abstract parse_query(qs: str) dict

Parse query string from search query and convert it into rulez query dictionary. The dictionary would be passed to search method afterwards, which you can then parse into your backend search query.

abstract search(query: Optional[dict] = None, offset: int = 0, limit: Optional[int] = None, order_by: Union[None, list, tuple] = None) List[IModel]

Execute search and return list of model objects

Overriding Search Provider

import typing
import morpfw
from .app import App
from .model import PageCollection


class PagesSearchProvider(morpfw.SearchProvider):

    def search(self, query=None, offset=0, limit=None, order_by=None):
        """search for resources and return list of resource model objects"""
        result = []
        # do something here
        return result


@App.searchprovider(model=PageCollection)
def get_searchprovider(context):
    return PagesSearchProvider(context)