Skip to content

内置搜索插件

搜索插件在头部添加了一个搜索栏,允许用户搜索您的文档。它由 lunr.js 提供支持,这是一款轻量级的浏览器全文搜索引擎,消除了对外部服务的需求,并且在构建 离线可用文档 时也能正常工作。

目标

工作原理

该插件扫描生成的 HTML,并通过提取部分标题和内容来构建所有页面和部分的搜索索引。它保留了一些内联格式,如代码块和列表,但移除了所有其他格式,以使搜索索引尽可能小。

当用户访问您的网站时,搜索索引被发送到浏览器,使用 lunr.js 进行索引,并可以快速简单地查询——无需服务器。这确保了搜索索引始终与您的文档保持最新,从而产生准确的结果。

何时使用

通常建议使用该插件,因为交互式搜索功能是每个优秀文档的重要组成部分。此外,该插件与 Material for MkDocs 提供的其他多个 内置插件 完美集成:

  •   内置离线插件


    离线插件支持构建离线可用文档,因此您可以将 site 目录 作为 .zip 文件进行分发,供下载。


    您的文档可以在没有互联网连接的情况下工作

  •   内置元插件


    元插件使得在搜索结果中 提升 特定部分的排名或 完全排除 它们以便不被索引变得简单,从而提供对搜索的更细粒度控制。


    更简单地组织和管理不同子部分的搜索

配置

9.0.0 search – built-in

与所有 内置插件 一样,开始使用搜索插件非常简单。只需将以下行添加到 mkdocs.yml 中,您的用户就可以搜索您的文档:

plugins:
  - search

搜索插件内置于 Material for MkDocs 中,无需安装。

一般设置

以下设置可用:


enabled

9.3.2 true

使用此设置在 构建项目 时启用或禁用插件。通常不需要指定此设置,但如果您想禁用插件,请使用:

plugins:
  - search:
      enabled: false

搜索

以下设置可用于搜索:


lang

9.0.0

使用此设置指定搜索索引的语言,启用对英语以外其他语言的 词干提取 支持。默认值是从 网站语言 自动计算的,但可以显式设置为其他语言,甚至多种语言:

plugins:
  - search:
      lang: en
plugins:
  - search:
      lang: # (1)!
        - en
        - de
  1. 请注意,支持更多语言会使基础 JavaScript 负载增加约 20kb,每种语言再增加 15-30kb,所有这些都是在 gzip 之前。

语言支持由 lunr 语言 提供,这是一个由开源社区维护的语言特定词干提取器和停用词的集合。


当前 lunr 语言 支持以下语言:

  • ar – 阿拉伯语
  • da – 丹麦语
  • de – 德语
  • du – 荷兰语
  • en – 英语
  • es – 西班牙语
  • fi – 芬兰语
  • fr – 法语
  • hi – 印地语
  • hu – 匈牙利语
  • hy – 亚美尼亚语
  • it – 意大利语
  • ja – 日语
  • kn - 卡纳达语
  • ko – 韩语
  • no – 挪威语
  • pt – 葡萄牙语
  • ro – 罗马尼亚语
  • ru – 俄语
  • sa – 梵语
  • sv – 瑞典语
  • ta – 泰米尔语
  • te – 泰卢固语
  • th – 泰语
  • tr – 土耳其语
  • vi – 越南语
  • zh – 中文

如果 lunr 语言 不支持所选的 网站语言,插件将回退到其他语言,以获得最佳的词干提取结果。如果您发现搜索结果不令人满意,可以通过为您的语言添加支持来为 lunr 语言 贡献。


separator

9.0.0

使用此设置指定在客户端构建搜索索引时用于拆分单词的分隔符。默认值是从 网站语言 自动计算的,但也可以显式设置为其他值:

plugins:
  - search:
      separator: '[\s\-,:!=\[\]()"/]+|(?!\b)(?=[A-Z][a-z])|\.(?!\d)|&[lg]t;'

分隔符支持 正向和负向前瞻断言,这允许使用相当复杂的表达式,从而精确控制在构建搜索索引时如何拆分单词。

分隔符的各个部分产生以下行为:

[\s\-,:!=\[\]()"/]+

表达式的第一部分在每个文档的空格、连字符、逗号、括号和其他特殊字符之前和之后插入标记边界。如果多个特殊字符相邻,它们将被视为一个。

(?!\b)(?=[A-Z][a-z])

许多编程语言有命名约定,如 PascalCasecamelCase。通过将此子表达式添加到分隔符中,在大小写变化处拆分单词,将单词 PascalCase 拆分为 PascalCase

\.(?!\d)

当将 . 添加到分隔符时,版本字符串如 1.2.3 将被拆分为 123,这使得它们无法通过搜索发现。使用此子表达式时,引入了一个小的前瞻,这将 保留版本字符串 并保持其可发现性。

&[lg]t;

如果您的文档包含 HTML/XML 代码示例,您可能希望用户能够找到 特定标签名称。不幸的是,控制字符 <> 在代码块中被编码为 &lt;&gt;。将此子表达式添加到分隔符中可以实现这一点。


pipeline

9.0.0

使用此设置指定在使用 separator 对令牌进行标记化后以及在将它们添加到搜索索引之前,用于过滤和扩展令牌的 管道函数。默认值是从 网站语言 自动计算的,但也可以显式设置为:

plugins:
  - search:
      pipeline:
        - stemmer
        - stopWordFilter
        - trimmer

可以使用以下管道函数:

  • stemmer – 将令牌词干化为其根形式,例如将 running 变为 run
  • stopWordFilter – 根据常见词过滤,例如 athe
  • trimmer – 修剪令牌中的空格

分词

该插件通过 jieba 支持中文的文本分词,这是一个流行的中文文本分词库。其他语言如日语和韩语目前在客户端进行分词,但我们考虑在未来将此功能移入插件中。

以下设置可用于分词:


jieba_dict

9.2.0

使用此设置指定 jieba 用于分词的 自定义词典,以替换默认词典。jieba 附带多个词典,可以使用:

plugins:
  - search:
      jieba_dict: dict.txt

jieba 提供以下词典:

提供的路径是从根目录解析的。


jieba_dict_user

9.2.0

使用此设置指定一个额外的 用户词典,供 jieba 用于分词,增强默认词典。用户词典非常适合调优分词器:

plugins:
  - search:
      jieba_dict_user: user_dict.txt

提供的路径是从根目录解析的。

用法

元数据

以下属性可用:


boost

8.3.0

使用此属性增加或减少页面在搜索结果中的相关性,给予其更高的权重。使用大于 1 的值提高排名,使用小于 1 的值降低排名:

---
search:
  boost: 2 # (1)!
---

# 页面标题
...
  1. 提高页面排名时,始终从低值开始。
---
search:
  boost: 0.5
---

# 页面标题
...

exclude

9.0.0

使用此属性将页面从搜索结果中排除。请注意,这不仅会移除该页面,还会将该页面的所有子部分也从搜索结果中移除:

---
search:
  exclude: true
---

# 页面标题
...