本文介绍一例文章字数超过Algolia单条记录限制引起的部署错误,并记录阿猪的排查过程与解决办法。

一、问题场景

  阿猪使用Algolia为自己的Hexo博客提供搜索服务,使用了Hexo-AlgoliaSearch插件。平时一直都正常,但是如果遇到某篇文章超过了5000个字符,则部署的时候就会报如下错误:

[2024-08-17 17:47:59] INFO Error has occurred during indexing posts : [object Object]
[2024-08-17 17:47:59] FATAL Something’s wrong. Maybe you can find the solution here: https://hexo.io/docs/troubleshooting.html

二、原因排查

  根据报错的信息,可以大致确定与Hexo-AlgoliaSearch插件有关。

  因为之前一直都正常,写了新文章之后才开始产生报错,再结合报错信息,阿猪起先猜测可能是新文章的md文件中包含有特殊的字符组合,导致创建索引的时候产生错误。但经过反复排查和调试,最后否定了这个猜测。

  在排查的过程中,阿猪发现减少文章的字数后报错就会消失,当文章的字数增加到一定程度后,报错又会出现。阿猪猜测可能是因为文章的字数超过了索引的限制,于是在_config.yml文件中查看与这个插件有关的配置,找到两处认阿猪认为可能相关的内容:

1
2
3
4
5
6
7
#algolia Configuration
algolia:
......
chunkSize: 5000
......
fields:
- content:strip:truncate,0,5000

  于是阿猪分别尝试上调数值,但遗憾的是问题依然存在。

  最后阿猪查阅这个插件的说明文档,看到如下说明:

Key Type Default Description
chunkSize Number 5000 Records/posts are split in chunks to upload them. Algolia recommend to use 5000 for best performance. Be careful, if you are indexing post content, It can fail because of size limit. To overcome this, decrease size of chunks until it pass.
Filter Signature Syntax Description
truncate truncate(start: number, end: number) truncate,0,300 Truncate string from start index to end index. Algolia has some limitations about record size so it might be useful to cut post contents.

  根据文档中的说明,Algolia对存储的记录有大小限制,如果遇到超过限制的情况,请尝试往小调整截取内容的长度。再查询Algolia的官方文档,免费用户单条记录不能超过10kb。

三、解决方法

1、修改参数

  逐渐往小调整content中截取内容的长度,直到不再出现报错为止。经过几番尝试,阿猪将截取的内容长度从5000个字符下调到了3000个字符。

  这个方法的缺点:如果一篇文章的长度超过了截取的长度上限,则超出长度上限那部分的内容不会被索引。

2、拆分文章

  如果一篇文章的内容过长,也可以考虑将其拆分为多篇文章。这样可以确保文章的内容都被索引。

  这个方法的缺点:可能会影响访客的阅读体验。

3、升级为付费用户

  付费用户单条记录的大小限制是100kb,理论上可以存储约10万个字符(不是汉字),一般文章的字数都不会超过这个长度。