Skip to content
pollybird edited this page Sep 9, 2026 · 2 revisions

全文搜索

全文搜索

前台 /search 优先走索引,故障或零命中时自动回退 SQL LIKE。

三种后端

后端 依赖 适用 默认
Whoosh + jieba 纯 Python 中小站点,零外部服务 ✅
Meilisearch 独立进程 文章 > 5 万的大型站点 可选
SQL LIKE 无 索引未建、故障或零命中兜底 自动

索引与更新

  • 索引范围:文章(标题 + 正文去 HTML + 摘要 + 栏目名)+ 插件内容(产品、招聘岗位,v2.5.2)
  • 自动更新:文章与插件内容保存/删除时通过钩子触发,独立于缓存开关
  • 重建索引:后台「搜索设置」一键重建,未索引前自动回退 SQL LIKE
  • 索引位置:instance/search_index/<locale>/(按语言分目录)

6 套主题搜索模板均支持分页与关键词高亮(|highlight(keyword)|safe)。

多语言检索(v2.5.1)

开启内容级多语言后,搜索按当前语言检索对应语言的内容,三个后端均已适配:

  • Whoosh:按语言分索引目录 instance/search_index/<locale>/;Meilisearch:按语言分索引 zhycms_articles_<locale>
  • 每篇内容对每种语言写入一份索引,内容经 t_field 解析——有翻译用翻译、无翻译回退默认语言(未翻译内容不会因切语言而搜不到)
  • 搜索结果的标题、摘要、栏目名均随当前语言显示;前台 /search 按 ?lang=xx / session 自动选索引
  • 该语言索引尚未建立时自动回退默认语言索引;i18n 关闭时仅维护默认语言单一索引,行为不变
  • 插件内容同样本地化检索(v2.5.2):产品的规格参数、岗位的部门/工作地点/薪资待遇均按语言索引与兜底匹配(如英文搜 Model、Shanghai 可命中)

升级到 v2.5.1 后,到后台「系统设置 → 搜索设置」点击一次**「重建索引」**即可生成各语言索引;内容保存/删除会自动同步全部语言索引,无需手动维护。

插件内容接入搜索(SearchProvider,v2.5.2)

插件通过 get_search_provider() 钩子返回一个 SearchProvider 实例,自有内容即可进入全站搜索(官方「产品展示」「招聘管理」已接入)。协议五要素:

成员 职责
type 内容类型标识(全局唯一,如 product / recruit_job),与 id 组成索引唯一键 uid = "类型:id"
iter_docs(locale) 重建索引时产出该语言下全部可见文档
get_doc(id, locale) 单条文档(保存时实时索引);返回 None 表示下架/删除,核心自动移出索引
sql_search(kw, locale, page, per_page) SQL LIKE 兜底检索(索引故障/未建/零命中时),需自行匹配翻译表
build_url(item) 搜索结果 → 详情页 URL(伪静态两种模式),核心统一分发

完整示例见「插件开发指南 → 全站搜索贡献」。文档以 uid 区分类型,文章与产品/岗位互不覆盖;插件禁用时核心回调 on_disabled() 清理索引残留。产品/岗位保存、删除、批量上下架均实时同步索引。

Clone this wiki locally