搜索

在 Frappe 中进行搜索由 Search 模块管理。它是 Whoosh 的封装,Whoosh 是一个用 Python 编写的全文搜索库。

您可以扩展 FullTextSearch 类,为特定需求创建搜索类。例如,WebsiteSearch 是一个用于索引公开网页并暴露搜索功能的封装。

FullTextSearch

每个 FullTextSearch(FTS)实例都持有一个由类本身定义的 Schema。这意味着,特定的 FTS 实现会有其特定的 schema。如果您希望使用不同的 schema 进行索引,可以创建新的实现。除此之外,FTS 类还提供了其他控制器,用于创建、更新和查询索引。

扩展 FTS 类

初始化基于 FTS 的类时,您需要提供一个索引名称。实例化时,会初始化以下参数:

  • index_name:提供的索引名称。
  • index_path:索引在站点文件夹中的路径。
  • schema:由 get_schema 函数返回。
  • id:用于在索引中识别文档的 ID。

实例化后,您可以运行 build 函数。它会从 get_items_to_index 获取所有文档,这些文档是符合定义 schema 的 frappe._dict(frappe 字典)列表。然后,这些文档会被添加到索引中并写入文件。

您可以使用 FTS 类的 search 方法搜索索引。这些函数在 API 参考文档中有详细说明。

博客的示例实现如下所示:

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:获取所有需要索引的路由,包括 www/ 目录下的静态页面以及已发布文档的路由。
  • get_document_to_index:渲染页面并使用 BeautifulSoup 进行解析。
  • parse_result:所有搜索结果都通过此函数进行解析。