跳至内容

搜索

配置站点搜索弹窗。Tralume 支持使用 pagefind 做静态本地搜索,也支持使用 meilisearch 接入托管的容错搜索后端。

支持的 provider

Provider后端必填配置
pagefind静态 Pagefind 索引主题配置中无需额外参数
meilisearch自托管或 Meilisearch CloudhostindexUid

Pagefind

Pagefind 是默认 provider:

[params.search]
  # 说明:启用搜索按钮与搜索弹窗。
  enable = true
  # 说明:加载构建流程生成的 /pagefind/<language>/pagefind.js。
  provider = 'pagefind'

主题只负责加载生成后的 Pagefind 脚本。你仍然需要在站点构建流程中把 Pagefind 索引生成到部署产物内。

Meilisearch

当你需要托管搜索后端、拼写容错、过滤、排序规则,或希望多个部署共享同一套搜索服务时,可以使用 Meilisearch。

[params.search]
  # 说明:启用搜索弹窗。
  enable = true
  # 说明:把前端搜索 provider 切换为 Meilisearch REST 搜索。
  provider = 'meilisearch'

  [params.search.meilisearch]
    # 说明:公开的 Meilisearch 访问地址,不要带结尾斜杠。
    host = 'https://search.example.com'
    # 说明:只能使用 Search API Key,禁止在前端暴露 master key 或 admin key。
    apiKey = 'search-only-public-key'
    # 说明:存放当前站点或当前语言文档的索引 UID。
    indexUid = 'tralume_posts_zh'

前端会调用 POST /indexes/{index_uid}/search。不需要额外引入 Meilisearch JavaScript SDK 或 CDN 脚本。

文档字段

默认情况下,Tralume 假定每条 Meilisearch 文档包含这些字段:

字段用途
idMeilisearch 主键
title搜索结果标题
url结果链接
content用于生成摘要的正文
summarydescription可选的摘要备用字段
section可选的结果元信息

如果你的索引字段不同,可以手动映射:

[params.search.meilisearch]
  # 说明:把结果标题映射到你的索引字段。
  titleAttribute = 'headline'
  # 说明:把结果链接映射到你的索引字段。
  urlAttribute = 'permalink'
  # 说明:映射显示在标题下方的简短元信息。
  metaAttribute = 'category'
  # 说明:让 Meilisearch 从这些字段中裁剪摘要。
  excerptAttributes = ['body', 'summary']

搜索参数

Tralume 暴露了搜索弹窗常用的 Meilisearch 搜索参数:

[params.search.meilisearch]
  # 说明:搜索弹窗最多展示多少条结果。
  limit = 20
  # 说明:Meilisearch 返回摘要时最多保留多少个词。
  cropLength = 24
  # 说明:限制返回字段;这些字段必须属于 Meilisearch 的 displayedAttributes。
  attributesToRetrieve = ['title', 'url', 'content', 'section']
  # 说明:限制参与搜索的字段;这些字段必须属于 Meilisearch 的 searchableAttributes。
  attributesToSearchOn = ['title', 'content']
  # 说明:可选过滤表达式;被过滤字段必须属于 Meilisearch 的 filterableAttributes。
  filter = 'lang = "zh-Hans"'
  # 说明:可选排序规则;被排序字段必须属于 Meilisearch 的 sortableAttributes。
  sort = ['date:desc']
  # 说明:可选查询匹配策略,取值需由 Meilisearch 支持。
  matchingStrategy = 'last'
  # 说明:可选高亮字段;匹配到的词条会被 <em> 标签包裹。
  highlightAttributes = ['title', 'content']

Meilisearch 需要先配置索引设置,过滤和排序才能生效。用于过滤的字段要加入 filterableAttributes,用于排序的字段要加入 sortableAttributes

多语言站点

多语言站点可以选择“每种语言一个索引”,也可以选择“共用一个索引并通过语言字段过滤”。

[params.search.meilisearch]
  # 说明:当每个 Hugo 语言都有独立 params 覆盖时,可使用语言专属索引。
  indexUid = 'tralume_posts_zh'
[params.search.meilisearch]
  # 说明:共用同一索引,并用文档中的 lang 字段过滤当前语言。
  indexUid = 'tralume_posts'
  filter = 'lang = "zh-Hans"'

如果使用 Meilisearch 的 locales 参数,请传入 Meilisearch 支持的 ISO 语言代码,例如 enzh

[params.search.meilisearch]
  # 说明:帮助 Meilisearch 为查询选择预期的语言分析器。
  locales = ['zh']

安全

apiKey 会下发到浏览器。只能使用限制在目标索引和 search 动作内的 Search API Key。不要暴露 master key、默认 admin key,或任何可以写入文档、修改设置的密钥。

# 说明:为单个索引创建权限收窄的 Search API Key。
# 注意:这条命令只能在可信机器上配合 master key 执行,不能放进浏览器代码。
curl -X POST "${MEILISEARCH_URL}/keys" \
  -H "Authorization: Bearer ${MEILISEARCH_MASTER_KEY}" \
  -H "Content-Type: application/json" \
  -d '{
    "description": "Tralume frontend search",
    "actions": ["search"],
    "indexes": ["tralume_posts_zh"],
    "expiresAt": null
  }'

行为说明

  • Tralume 只实现前端查询 UI,不负责把 Hugo 内容上传到 Meilisearch。
  • Meilisearch 的 host 必须允许站点来源发起浏览器请求,可通过 CORS 或反向代理实现。
  • 只有当 Meilisearch 端点有意公开且不启用鉴权时,才可以省略 apiKey
  • 缺少 hostindexUid 时,搜索弹窗会显示常规“搜索暂不可用”状态。
最后更新于 • alexma233