在 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:所有搜索结果都通过此函数进行解析。