相关内容
Hugo使用一组因素根据前端参数来确定页面的相关内容。您可以调整为所需的索引和参数集,也可以使用Hugo的默认的关联内容配置。
列出相关内容
要列出最多5个相关页面(共享相同的_date_或_keyword_参数),只需在单页面模板中包含类似以下的片段简单:
Related
方法接受一个参数,可以是Page
或选项映射。选项映射有以下选项:
- indices
- (
slice
) 搜索的索引。 - document
- (
page
) 要找到相关内容的页面。使用选项映射时需要。 - namedSlices
- (
slice
) 搜索的关键字,表示为使用keyVals
函数为KeyValues
的切片。 - fragments
- (
slice
) 特殊关键字列表,用于配置为类型“fragments”的索引。这将匹配文档的fragment标识符。
使用上述所有选项的虚构示例:
{{ $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")
}}
在相关内容中索引内容标题
Hugo可以索引内容中的标题,并使用此功能查找相关内容。您可以通过将类型为fragments
的索引添加到related
配置中来启用此功能:
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
映射到可选的前端切片属性,可用于从页面级别链接到片段/标题级别。- 如果启用了
applyFilter
,结果中每个页面上的.HeadingsFiltered
将反映过滤后的标题。如果想在相关内容列表中显示标题,这非常有用:
{{ $related := .Site.RegularPages.Related . | first 5 }}
{{ with $related }}
<h2>另请参阅</h2>
<ul>
{{ range $i, $p := . }}
<li>
<a href="{{ .RelPermalink }}">{{ .Title }}</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
}
}
应按照相同的语法设置自定义配置。
顶级配置选项
- threshold
- 0-100之间的值。较低的值将提供更多(但可能不是那么相关)的匹配。
- includeNewer
- 设置为true以在相关内容列表中包括比当前页面新的页面。这意味着随着添加新的相关内容,旧帖子的输出可能会改变。
- toLower
- 设置为true以将索引和查询中的关键字都转换为小写。这可能会在略微影响性能的情况下产生更准确的结果。注意,这也可以按索引设置。
索引的配置选项
- name
- 索引名称。此值直接映射到页面参数。Hugo支持字符串值(例如示例中的
author
)和列表(tags
,keywords
等)和时间和日期对象。 - type
-
。
basic
(默认)或fragments
之一。 - applyFilter
-
。对搜索结果应用特定于
type
的过滤器。目前仅用于fragments
类型。 - weight
- 整数权重,表示该参数与其他参数的相对重要性。可以为0,这将关闭该索引的效果,甚至可以为负数。可以尝试不同的值来找到最适合您内容的配置。
- cardinalityThreshold (默认为0)
- 。用于从索引中删除常见关键字的百分比(0-100)。例如,将其设置为50将删除在索引中使用在超过50%的文档中使用的所有关键字。
- pattern
- 目前仅与日期相关。在列出相关内容时,我们可能希望列出在时间上相近的内容。为日期索引设置“2006”(默认日期索引的值)作为模式将增加在同一年内发表的页面的权重。对于较繁忙的博客,“200601”(年和月)可能是更好的默认设置。
- toLower
- 参见上文。
性能考虑
快是Hugo的名字,如果它不是非常快,我们不会推出这个功能。
这个功能已经在待办事项中并且用户们很长一段时间以来一直在请求。这个开发最近从Twitter上的这个帖子得到了推动:
Scott S. Lowe使用intersect
模板函数构建的“相关内容”部分,将生成时间从30秒降低到了少于2秒,而这个博客有1700个内容页面。
现在他应该能够添加这个“相关内容”的改进版本,而无需放弃快速的实时重新加载。但值得注意的是:
- 如果您不使用任何
Related
方法,您将不使用相关内容功能,性能与以前相同。 - 调用
.RegularPages.Related
等将创建一个倒排索引,有时也称为posting list,该索引将在相同的页面集合中的任何查找中重复使用。如果除此之外,例如调用.Pages.Related
,将按预期工作,但将创建一个额外的倒排索引。这仍然非常快,但值得注意,特别是对于较大的站点。