ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Material for MkDocs 内置搜索插件中文分词支持(jieba)配置与源码解析

Material for MkDocs 内置搜索插件中文分词支持(jieba)配置与源码解析 Material for MkDocs 内置搜索插件中文分词支持jieba配置与源码解析【免费下载链接】mkdocs-materialDocumentation that simply works项目地址: https://gitcode.com/GitHub_Trending/mk/mkdocs-material中文文档站点的站内搜索质量长期以来受限于分词tokenization能力中文不像英文那样以空格分隔单词需要专用的分词器才能建立可检索的词项索引。本文以 Material for MkDocs 内置搜索插件为例说明它如何通过 jieba 分词库为简体/繁体中文提供开箱即用的搜索支持涵盖安装配置、separator分隔符的调整、自定义词典的用法并结合 搜索插件源码 拆解自动检测汉字 → 分词 → 零宽空格拼接的完整实现链路。读完本文你可以在自己的文档站点上快速启用可用的中文搜索并理解其背后的工作原理与实验性限制。背景为什么中文搜索长期难以实现Material for MkDocs 的内置搜索插件基于 lunr.js 构建客户端分词与词干提取stemming依赖 lunr-languages 提供的语言支持。早期 lunr-languages 并未提供中文分词而中文文本没有空格作为天然词边界一个句子可以按多种方式切分成不同词组例如支持、技术支持、支持系统等。缺失分词意味着搜索支持时无法命中技术支持搜索体验大打折扣。在中国是 Material for MkDocs 用户来源第三大国家仅次于美国和德国的背景下中文搜索支持成为被社区反复请求的功能。本仓库 中文搜索支持博客文章 记录的实验性支持正是为了弥补这一缺口——它由 jieba结巴中文分词库在构建期完成文本切分而非在浏览器端进行。原理jieba 分词 零宽空格拼接从源码结构看中文支持的核心逻辑位于 搜索插件实现 的SearchIndex._segment_chinese方法中对应源码段def _segment_chinese(self, data): expr bre.compile(r(\p{script: Han}), bre.UNICODE) # Replace callback def replace(match): value match.group(0) return .join([ \u200b, \u200b.join(jieba.cut(value.encode(utf-8))), \u200b, ]) return expr.sub(replace, data).strip(\u200b)其工作流程分为三步检测汉字序列用 Unicode 属性正则\p{script: Han}匹配文本中的连续汉字片段非汉字内容英文、数字、标点、HTML 标签原样保留调用 jieba 分词对每个汉字片段执行jieba.cut()得到切分后的词项列表零宽空格拼接将切分后的词用零宽空格\u200bU200B连接并在片段两端各补一个\u200b。这样既在索引中为每个词项创造了明确边界又因零宽空格不可见、不占宽度分词后的文本在搜索弹窗中渲染效果与原文本完全一致。该分词发生在构建期on_page_context阶段插件解析每个页面的 HTML 并生成分段条目在create_entry_for_section中对应源码段对条目的title与text分别调用_segment_chinese最终由on_post_build将结果写入search/search_index.json。也就是说浏览器拿到的搜索索引中的中文已经是分词后的形态。而 jieba 的引入是完全可选的插件顶部使用try: import jieba except ImportError: jieba None的方式导入对应源码段未安装时功能自动降级、插件照常工作。配置步骤第一步安装 jieba中文支持由 jieba 提供安装后内置搜索插件会自动检测汉字并调用分词器无需在mkdocs.yml中显式开启pip install jieba在构建文档的 Python 环境中执行即可。若你的构建流程使用requirements.txt管理依赖可将其加入其中。第二步按需调整 separator 分隔符separator决定客户端构建搜索索引时如何切分词项插件文档。由于分词结果以零宽空格\u200b拼接只有当你在mkdocs.yml中自定义了separator时才需要手动把\u200b纳入分隔符否则分词结果会被错误地合并回一个长词中文搜索将失效plugins: - search: separator: [\s\u200b\-]如果未自定义separator则无需任何额外操作。插件在on_config阶段会从站点语言模板自动获取默认分隔符对应源码段。以 简体中文语言模板 为例其默认值已经内置了零宽空格、全角空格及中文标点search.config.separator: [\s\u200b\u3000\-、。]可见默认分隔符同时覆盖了\s空白、\u200b零宽空格、\u3000全角空格以及顿号、句号、逗号等常见中文标点繁体中文语言模板 亦采用相同定义。因此采用默认语言lang: zh或language: zh的站点安装 jieba 后即可直接获得中文搜索能力。第三步可选自定义 jieba 词典从 插件文档的 Segmentation 章节 及 搜索插件配置定义 可见搜索插件还提供了两个用于调校分词结果的实验性配置项配置项作用配置示例jieba_dict替换 jieba 默认词典jieba_dict: dict.txtjieba_dict_user在默认词典之上追加用户词典适合补充领域术语、人名等专有词jieba_dict_user: user_dict.txt例如使用 jieba 自带的、更擅长繁体分词的词典或内存占用更小的精简词典plugins: - search: jieba_dict: dict.txt.big # 繁体分词更好 # jieba_dict: dict.txt.small # 占用内存更小路径均以仓库根目录为基准解析。从源码实现看对应源码段on_config阶段会校验路径是否存在jieba_dict通过jieba.set_dictionary()生效jieba_dict_user通过jieba.load_userdict()生效路径无效时插件仅记录警告日志而不会中断构建。用户词典文件的格式为每行一个词可附带词频与词性例如自定义文档平台 3 n 结巴分词 3 n需要注意的是分词发生在构建期因此每次修改词典后都必须重新构建站点索引才会更新。使用与验证完成上述配置并重新构建后中文词项即可通过 jieba 正确切分。你可以直接在搜索框输入一个中文词组如支持验证由于索引中的文本已经按分词结果切分查询时便能精确命中对应段落。一个值得注意的细节是搜索插件同时支持中文 英文/代码混合的索引场景。_segment_chinese只对汉字序列分词英文、数字与代码内容保持原有 token 化流程因此[\s\u200b\-]这类分隔符配置对两种语言都适用。此外search 插件的字段权重与元数据配置如meta.search.boost、meta.search.exclude与中文分词相互独立、可正常叠加使用。注意事项与实验性声明需要明确的是中文搜索支持在 中文搜索支持博客文章 中被明确标记为experimental实验性功能该能力最初随 Insiders 版本发布随后合并进开源主线但作者本人并不精通中文分词质量直接取决于 jieba 词典与你的自定义词典对于复杂领域文档建议通过jieba_dict_user补充专业术语词典以提升切分准确率若你的站点同时使用separator的 lookahead 高级特性如大小写拆分(?!\b)(?[A-Z][a-z])、版本号保留\.(?!\d)、HTML 标签实体[lg]t;详见 插件文档请确保将\u200b与这些子表达式一并组合进自定义分隔符否则中文分词边界会被破坏。从当前仓库源码看中文分词能力已内置在 搜索插件 中且默认随语言模板启用这使它成为中英文混合文档站点的实用增强安装一个 pip 包、必要时补充一个词典即可显著改善中文搜索体验。【免费下载链接】mkdocs-materialDocumentation that simply works项目地址: https://gitcode.com/GitHub_Trending/mk/mkdocs-material创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表