Searching in Frappe is managed by the Search module. It is a wrapper for Whoosh a full text search library written in Python.

You can extend the FullTextSearch class to create a search class for a specific requirement. For example the WebsiteSearch is a wrapper for indexing public facing web pages and exposing a search.

The FullTextSearch class

Each FullTextSearch (FTS) instance holds a Schema defined by the class itself. That means, a specific FTS implementation will have it's specific schema. You can create a new implementation if you wish to index with a different schema. Along with this the FTS class has other controllers to facilitate creating, updating and querying the index.

Extending the FTS class

When initializing a FTS based class, you need to provide an index name. On instantiation, the following params are initialized - index_name: name of the index provided. - index_path: path of the index in the sites folder - schema: return by the get_schema function - id: id used to recognize the document in the index

Once instantiated you can run the build function. It gets all the documents from get_items_to_index, the documents are a list of frappe._dict (frappe dicts) conforming to the defined schema. These documents are then added to the index and written to the file.

You can search the index using the search method of the FTS class. These functions are documented in the API reference here.

An example implementation for blog will look like the following:

class BlogWrapper(FullTextSearch):
    # Default Schema
    # def get_schema(self):
    #   return Schema(name=ID(stored=True), content=TEXT(stored=True))

    # def get_id(self):
    #   return "name"

    def get_items_to_index(self):
        docs = []
        for blog_name in get_all_blogs():
            docs.append(get_document_to_index(blog_name))
        return docs

    def get_document_to_index(self, name):
        blog = frappe.get_doc("Blog Post", name)
        return frappe._dict(name=name, content=blog.content)

    def parse_result(self, result):
        return result["name"]
  • get_items_to_index: Get all routes to be indexed, this includes the static pages in www/ and routes from published documents
  • get_document_to_index: Render a page and parse it using BeautifulSoup
  • parse_result: all the search results are parsed using this function