Closed rxliuli closed 1 year ago
只用前端实现全文搜索感觉不太现实。
后端的话就好办太多了。Cloudflare Workers 免费版每天有十万次请求额度,也就是每分钟60次。我感觉对于我们的网站来说,在可以预见的未来内,是绰绰有余了。
只用前端实现全文搜索感觉不太现实。
后端的话就好办太多了。Cloudflare Workers 免费版每天有十万次请求额度,也就是每分钟60次。我感觉对于我们的网站来说,在可以预见的未来内,是绰绰有余了。
吾辈考虑过 cloudflare workers,但不确定是否有什么现有的工具可以做到这点,也不确定在受限制的 vm 中(每个请求的 CPU 时间有限制)是否可以做这种感觉上是 CPU 密集型的操作
唔,像正经搜索引擎那种级别的全文搜索的话肯定是不够用的,但我们肯定不需要做到那个级别的自然语言处理。我感觉讨论这个问题首先得明确我们的需求。我看了一下目前我们的文本量大约有4MB(UTF-8),那么:
haystack.contains("needle")
这种的话,10ms的时间是肯定足够的。虽然功能比较有限,但我感觉已经可以胜任大多数的简单搜索需求其实与其搜索文本,我倒是有一个能大幅改善查资料的体验的想法。TTS每一章不是由多个POV“部分”构成的嘛,我们能不能把每一部分给人工标记一下,注明POV角色以及大致发生了什么。有点像这种形式。这样的话如果一个人对TTS的剧情已经有一定印象,但是想要找到某一情节具体是在哪里发生的(这其实就是我100%的搜索TTS的场景),有了这个索引就可以在短时间内肉眼定位,不需要凭借着模糊记得的关键词和章节去尝试搜索了。
一个基本的设计思路,不过可能要晚点实现了。里面涉及到很多第三方的 API,像是 github actions/github app/cf-worker/cf-kv 之类的
做了一些基本的测试,确定了纯服务端搜索是不可能的,所以打算仍然使用客户端搜索,目前已知的信息
index
事实证明,这比吾辈想象中更加复杂,文档网站没有如此大量的文本所有可以实现客户端搜索,但对于小说的文本量而言,这似乎是不可接受的。
pages meta data: 5.66M index data: 7.08M
正常压缩之后大约一共 5.1M,吾辈的 blog 网站的 index 文件也不过 800k+ 而已。。。
将两个 json 发布到了 github pages,一些基本的加载时间测试
拼接: https://tts.liuli.moe/{index.json/meta.json} 可以下载这两块内容
文件 | gzip 尺寸 | 加载时间 |
---|---|---|
index.json | 3M | 3.19s |
meta.json | 2.2M | 4.75s |
实现了非常基本的搜索支持,分词❌,服务端❌,bug✅
动机
还是希望为网站添加搜索功能,目前当然可以下载 epub 再搜索,但如果在线就能搜索当然是更好的。
需求
调研
algolia-docsearch
algolia-docsearch 的服务可以为网站添加搜索功能,支持中文和 vuepress,主要问题是需要付费,因为文本量实在太大,默认 10k record 的免费层不够用。
vuepress-plugin-full-text-search2
vuepress 官方有一个搜索标题的插件 @vuepress/plugin-search,但其实我们希望的是全文搜索,为了避免额外的维护成本,也不希望使用后端服务。lunr 是一个支持多语言搜索的搜索引擎,非常适合嵌入到网站上。
实现
相关资源