相关内容

Related Content - 相关内容

https://gohugo.io/content-management/related/

​ 在"另请参阅"章节中列出相关内容。

​ Hugo 使用一组因素来基于前置元数据参数识别页面的相关内容。这可以调整为所需的索引和参数集,或者留给Hugo的默认相关内容配置

列出相关内容

​ 要列出最多 5 个相关页面(共享相同的datekeyword参数),只需在您的单个页面模板中包含类似以下内容的partial:

layouts/partials/related.html

1
2
3
4
5
6
7
8
9
{{ $related := .Site.RegularPages.Related . | first 5 }}
{{ with $related }}
<h3>See Also</h3>
<ul>
 {{ range . }}
 <li><a href="{{ .RelPermalink }}">{{ .Title }}</a></li>
 {{ end }}
</ul>
{{ end }}

Related方法接受一个参数,可以是Page或选项映射。这些选项映射具有以下选项:

  • indices

    要搜索的索引。

  • document

    要搜索相关内容的文档。

  • namedSlices

    要搜索的关键字。

  • fragments

    片段(fragments )包含一个用于配置为"fragments"类型的索引的特殊关键字列表。这将匹配文档的片段(fragment )标识符。

​ 使用以上所有选项的虚构示例:

1
2
3
4
5
6
7
{{ $page := . }}
{{ $opts := 
  "indices" (slice "tags" "keywords")
  "document" $page
  "namedSlices" (slice (keyVals "tags" "hugo" "rocks") (keyVals "date" $page.Date))
  "fragments" (slice "heading-1" "heading-2")
}}

​ 我们在Hugo 0.111.0中改进和简化了这个功能。在此之前,我们有3种不同的方法:RelatedRelatedToRelatedIndicies。现在我们只有一个方法:Related。旧的方法仍然可用但已弃用。另请参阅此博客文章,以获得更高级用法的详细解释。

在相关内容中索引内容标题

New in v0.111.0

​ Hugo可以索引您内容中的标题,并使用此功能查找相关内容。您可以通过将类型为fragments的索引添加到related配置中来启用此功能:

config.

=== “yaml”

``` yaml
related:
  includeNewer: true
  indices:
  - applyFilter: false
    name: fragmentrefs
    type: fragments
    weight: 80
  threshold: 20
  toLower: false
```

=== “toml”

``` toml
[related]
  includeNewer = true
  threshold = 20
  toLower = false
[[related.indices]]
  applyFilter = false
  name = 'fragmentrefs'
  type = 'fragments'
  weight = 80
```

=== “json”

``` json
{
   "related": {
      "includeNewer": true,
      "indices": [
         {
            "applyFilter": false,
            "name": "fragmentrefs",
            "type": "fragments",
            "weight": 80
         }
      ],
      "threshold": 20,
      "toLower": false
   }
}
```
  • name映射到可选的前置元数据切片属性,可用于从页面级别链接到片段/标题(fragment/heading)级别。
  • 如果启用applyFilter,则结果中每个页面上的.HeadingsFiltered将反映筛选后的标题。如果您想在相关内容列表中显示标题,则这很有用:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
{{ $related := .Site.RegularPages.Related . | first 5 }}
{{ with $related }}
  <h2>See Also</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的相关内容方法将使用以下内容。

config.

=== “yaml”

``` yaml
related:
  includeNewer: false
  indices:
  - name: keywords
    weight: 100
  - name: date
    weight: 10
  threshold: 80
  toLower: false
```

=== “toml”

``` toml
[related]
  includeNewer = false
  threshold = 80
  toLower = false
[[related.indices]]
  name = 'keywords'
  weight = 100
[[related.indices]]
  name = 'date'
  weight = 10
```

=== “json”

``` json
{
   "related": {
      "includeNewer": false,
      "indices": [
         {
            "name": "keywords",
            "weight": 100
         },
         {
            "name": "date",
            "weight": 10
         }
      ],
      "threshold": 80,
      "toLower": false
   }
}
```

​ 请注意,如果您将tags配置为分类(taxonomy),那么tags将与上述默认配置一起添加,并且权重为80

​ 应该使用相同的语法设置自定义配置。

如果添加了一个related 配置部分,则需要添加完整配置。不能只设置例如 includeNewer,并使用 Hugo 默认值中的其他部分。

顶级配置选项

  • threshold

    0-100之间的值。较低的值将提供更多但可能不是很相关的匹配项。

  • includeNewer

    设置为true以在相关内容列表中包含新于当前页面的页面。这意味着旧帖子的输出可能会随着添加新的相关内容而发生变化。

  • toLower

    将索引和查询中的关键字转换为小写。这可能会以轻微的性能损失为代价提供更准确的结果。请注意,这也可以针对每个索引进行设置。

每个索引的配置选项

  • name

    索引名称。此值直接映射到页面参数。 Hugo支持字符串值(例如示例中的author)和列表(tagskeywords等)以及时间和日期对象。

  • type

    v0.111.0 中的新功能。basic(默认)或fragments之一。

  • applyFilter

    v0.111.0 中的新功能。将type特定的过滤器应用于搜索结果。目前仅用于fragments类型。

  • weight

    表示该参数相对于其他参数的重要性的整数权重。它可以是0,这将关闭此索引的效果,甚至可以是负数。使用不同的值进行测试,以确定最适合您内容的值。

  • cardinalityThreshold (default 0)

    v0.111.0 中的新功能。用于从索引中删除常见关键字的百分比(0-100)。例如,将此设置为50将删除在索引中使用超过50%的文档中使用的所有关键字。

  • pattern

    目前仅对日期相关。在列出相关内容时,我们可能希望列出时间上也接近的内容。将"2006"(日期索引的默认值)设置为日期索引的模式将增加发布于同一年的页面的权重。对于访问频繁的博客,“200601”(年份和月份)可能是更好的默认值。

  • toLower

    见上文。

性能考虑

​ 快是Hugo的中间名,如果它不是非常快,我们不会发布此功能。

​ 这个功能已经在后台计划中,并被很多人长期要求。这个开发最近受到这个Twitter帖子的推动:

​ Scott S. Lowe 移除了使用标签上的intersect模板函数构建的"相关内容"部分,结果在其拥有 1700 篇文章的博客上,构建时间从 30 秒减少到不到 2 秒。

​ 他现在应该能够添加一个改进版的"相关内容"部分,而不会影响快速的实时重新加载。但需要注意的是:

​ 他现在应该能够添加改进版的"相关内容"部分,而不放弃快速的实时重载。但值得注意的是:

  • 如果您不使用任何Related方法,您将不会使用相关内容功能,性能将与之前相同。
  • 调用.RegularPages.Related等将创建一个倒排索引(有时也称为posting list),它将被重用于同一页面集合中的任何查找。在另外调用.Pages.Related之类的方法时,它会按预期工作,但会创建一个额外的倒排索引。这仍然非常快,但值得注意,特别是对于较大的站点。

​ 我们目前不对页面内容进行索引。我们认为在解决 Sherlock 的最后一个案件之前,发布一些能让大多数人满意的东西是值得的。

另请参阅

最后修改 May 22, 2023: 第一次提交 (9f24e27)