相关内容
Hugo 使用一组因素根据前置 matter 参数识别页面的相关内容。这可以调整为所需的索引和参数集,也可以保留为 Hugo 的默认 相关内容配置。
列出相关内容
要列出最多 5 个相关页面(共享相同的日期或关键字参数),只需在模板中包含类似于此部分的内容即可
Related
方法接受一个参数,该参数可以是Page
或选项映射。选项映射具有以下选项
- 索引
- (
切片
) 要在其中搜索的索引。 - 文档
- (
页面
) 要为其查找相关内容的页面。在指定选项映射时需要。 - 命名切片
- (
切片
) 要搜索的关键字,表示为使用keyVals
函数的键值对
切片。 - 片段
- (
切片
) 用于配置为“片段”类型的索引的特殊关键字列表。这将匹配文档的 片段 标识符。
一个使用上述所有选项的虚构示例
{{ $page := . }}
{{ $opts := dict
"indices" (slice "tags" "keywords")
"document" $page
"namedSlices" (slice (keyVals "tags" "hugo" "rocks") (keyVals "date" $page.Date))
"fragments" (slice "heading-1" "heading-2")
}}
在相关内容中为内容标题建立索引
v0.111.0 中的新增功能Hugo 可以为内容中的标题建立索引,并使用它来查找相关内容。您可以通过在 related
配置中添加类型为 fragments
的索引来启用此功能
Hugo。
related:
includeNewer: true
indices:
- applyFilter: true
name: fragmentrefs
type: fragments
weight: 80
threshold: 20
toLower: false
[related]
includeNewer = true
threshold = 20
toLower = false
[[related.indices]]
applyFilter = true
name = 'fragmentrefs'
type = 'fragments'
weight = 80
{
"related": {
"includeNewer": true,
"indices": [
{
"applyFilter": true,
"name": "fragmentrefs",
"type": "fragments",
"weight": 80
}
],
"threshold": 20,
"toLower": false
}
}
name
映射到一个可选的前置 matter 切片属性,该属性可用于从页面级别链接到片段/标题级别。- 如果启用了
applyFilter
,则结果中每个页面上的.HeadingsFiltered
将反映已过滤的标题。如果您想在相关内容列表中显示标题,这将很有用
{{ $related := .Site.RegularPages.Related . | first 5 }}
{{ with $related }}
<h2>See Also</h2>
<ul>
{{ range $i, $p := . }}
<li>
<a href="{{ .RelPermalink }}">{{ .LinkTitle }}</a>
{{ with .HeadingsFiltered }}
<ul>
{{ range . }}
{{ $link := printf "%s#%s" $p.RelPermalink .ID | safeURL }}
<li>
<a href="{{ $link }}">{{ .Title }}</a>
</li>
{{ end }}
</ul>
{{ end }}
</li>
{{ end }}
</ul>
{{ end }}
配置相关内容
Hugo 提供了合理的相关内容默认配置,但您可以在配置中进行微调,如果需要,可以在全局或语言级别进行微调。
默认配置
在项目上未设置任何 related
配置的情况下,Hugo 的相关内容方法将使用以下内容。
Hugo。
related:
includeNewer: false
indices:
- applyFilter: false
cardinalityThreshold: 0
name: keywords
pattern: ""
toLower: false
type: basic
weight: 100
- applyFilter: false
cardinalityThreshold: 0
name: date
pattern: ""
toLower: false
type: basic
weight: 10
- applyFilter: false
cardinalityThreshold: 0
name: tags
pattern: ""
toLower: false
type: basic
weight: 80
threshold: 80
toLower: false
[related]
includeNewer = false
threshold = 80
toLower = false
[[related.indices]]
applyFilter = false
cardinalityThreshold = 0
name = 'keywords'
pattern = ''
toLower = false
type = 'basic'
weight = 100
[[related.indices]]
applyFilter = false
cardinalityThreshold = 0
name = 'date'
pattern = ''
toLower = false
type = 'basic'
weight = 10
[[related.indices]]
applyFilter = false
cardinalityThreshold = 0
name = 'tags'
pattern = ''
toLower = false
type = 'basic'
weight = 80
{
"related": {
"includeNewer": false,
"indices": [
{
"applyFilter": false,
"cardinalityThreshold": 0,
"name": "keywords",
"pattern": "",
"toLower": false,
"type": "basic",
"weight": 100
},
{
"applyFilter": false,
"cardinalityThreshold": 0,
"name": "date",
"pattern": "",
"toLower": false,
"type": "basic",
"weight": 10
},
{
"applyFilter": false,
"cardinalityThreshold": 0,
"name": "tags",
"pattern": "",
"toLower": false,
"type": "basic",
"weight": 80
}
],
"threshold": 80,
"toLower": false
}
}
自定义配置应使用相同的语法设置。
顶级配置选项
- 阈值
- (
整数
) 0-100 之间的值。较低的值将给出更多,但可能不太相关的匹配项。 - 包含更新
- (
布尔值
) 设置为true
以在相关内容列表中包含比当前页面更新的页面。这意味着,随着新相关内容的添加,旧帖子的输出可能会发生变化。 - 转换为小写
- (
布尔值
) 设置为true
以将索引和查询中的关键字都转换为小写。这可能会以略微的性能损失获得更准确的结果。请注意,这也可以针对每个索引设置。
每个索引的配置选项
- 名称
- (
字符串
) 索引名称。此值直接映射到页面参数。Hugo 支持字符串值(示例中的author
)和列表(tags
、keywords
等)以及时间和日期对象。 - 类型 v0.111.0 中的新增功能
- (
字符串
)basic
(默认)或fragments
之一。 - 应用过滤器 v0.111.0 中的新增功能
- (
字符串
) 对搜索结果应用类型
特定的过滤器。这目前仅用于fragments
类型。 - 权重
- (
int
) 一个整数权重,指示相对于其他参数,此参数**有多重要**。它可以是0
,这将导致关闭此索引,甚至可以是负数。尝试不同的值,看看哪个最适合你的内容。 - cardinalityThreshold v0.111.0 新功能
- (
int
) 如果介于 1 和 100 之间,则表示百分比。所有在超过此百分比的文档中使用的关键词都将被移除。例如,将其设置为60
将移除在索引中超过60%的文档中使用的所有关键词。如果为0
,则不会从索引中移除任何关键词。默认值为0
。 - pattern
- (
string
) 目前这仅与日期相关。列出相关内容时,我们可能希望列出时间上也接近的内容。将“2006”(日期索引的默认值)设置为日期索引的模式将为在同一年发布的页面增加权重。对于更繁忙的博客,“200601”(年和月)可能是更好的默认值。 - 转换为小写
- (
bool
) 请参见上文。
性能注意事项
速度是 Hugo 的代名词,如果没有极快的速度,我们也不会发布此功能。
此功能已在待办事项列表中很长时间,并且被很多人请求。最近,这个 Twitter 线程推动了开发工作
天哪!构建时间降至 1.2 秒!
— Scott S. Lowe (@scott_lowe) 2017年8月18日
Scott S. Lowe 移除了使用intersect
模板函数在标签上构建的“相关内容”部分,并且在他的包含 1700 个内容页面的博客中,构建时间从 30 秒减少到不到 2 秒。
他现在应该能够添加该“相关内容”部分的改进版本,而无需放弃快速实时重新加载。但值得注意的是
- 如果你不使用任何
Related
方法,你将不会使用“相关内容”功能,性能将与之前相同。 - 调用
.RegularPages.Related
等将创建一个反向索引,有时也称为发布列表,该索引将被重用于同一页面集合中的任何查找。除了例如调用.Pages.Related
之外,这样做将按预期工作,但会创建一个额外的反向索引。这仍然应该非常快,但值得牢记,尤其是在较大的网站上。