liuli-moe / to-the-stars

魔法少女小圆 飞向星空 中文翻译
http://tts.liuli.moe/
51 stars 16 forks source link

feat: 搜索功能集成调研 #22

Closed rxliuli closed 1 year ago

rxliuli commented 1 year ago

动机

还是希望为网站添加搜索功能,目前当然可以下载 epub 再搜索,但如果在线就能搜索当然是更好的。

需求

调研

algolia-docsearch

algolia-docsearch 的服务可以为网站添加搜索功能,支持中文和 vuepress,主要问题是需要付费,因为文本量实在太大,默认 10k record 的免费层不够用。

vuepress-plugin-full-text-search2

参考:docusaurus-search-local 似乎已经有一个不错的替代品:https://github.com/ota-meshi/vuepress-plugin-full-text-search2/issues/30#issuecomment-1250035901

vuepress 官方有一个搜索标题的插件 @vuepress/plugin-search,但其实我们希望的是全文搜索,为了避免额外的维护成本,也不希望使用后端服务。lunr 是一个支持多语言搜索的搜索引擎,非常适合嵌入到网站上。

实现

相关资源

andylizi commented 1 year ago

只用前端实现全文搜索感觉不太现实。

后端的话就好办太多了。Cloudflare Workers 免费版每天有十万次请求额度,也就是每分钟60次。我感觉对于我们的网站来说,在可以预见的未来内,是绰绰有余了。

rxliuli commented 1 year ago

只用前端实现全文搜索感觉不太现实。

后端的话就好办太多了。Cloudflare Workers 免费版每天有十万次请求额度,也就是每分钟60次。我感觉对于我们的网站来说,在可以预见的未来内,是绰绰有余了。

吾辈考虑过 cloudflare workers,但不确定是否有什么现有的工具可以做到这点,也不确定在受限制的 vm 中(每个请求的 CPU 时间有限制)是否可以做这种感觉上是 CPU 密集型的操作

andylizi commented 1 year ago

唔,像正经搜索引擎那种级别的全文搜索的话肯定是不够用的,但我们肯定不需要做到那个级别的自然语言处理。我感觉讨论这个问题首先得明确我们的需求。我看了一下目前我们的文本量大约有4MB(UTF-8),那么:

andylizi commented 1 year ago

其实与其搜索文本,我倒是有一个能大幅改善查资料的体验的想法。TTS每一章不是由多个POV“部分”构成的嘛,我们能不能把每一部分给人工标记一下,注明POV角色以及大致发生了什么。有点像这种形式。这样的话如果一个人对TTS的剧情已经有一定印象,但是想要找到某一情节具体是在哪里发生的(这其实就是我100%的搜索TTS的场景),有了这个索引就可以在短时间内肉眼定位,不需要凭借着模糊记得的关键词和章节去尝试搜索了。

rxliuli commented 1 year ago

一个基本的设计思路,不过可能要晚点实现了。里面涉及到很多第三方的 API,像是 github actions/github app/cf-worker/cf-kv 之类的

image

rxliuli commented 1 year ago

做了一些基本的测试,确定了纯服务端搜索是不可能的,所以打算仍然使用客户端搜索,目前已知的信息

index

data.zip

rxliuli commented 1 year ago

事实证明,这比吾辈想象中更加复杂,文档网站没有如此大量的文本所有可以实现客户端搜索,但对于小说的文本量而言,这似乎是不可接受的。

pages meta data: 5.66M index data: 7.08M

正常压缩之后大约一共 5.1M,吾辈的 blog 网站的 index 文件也不过 800k+ 而已。。。

测试代码均在:https://github.com/liuli-moe/to-the-stars/tree/feat-search/.vuepress/plugins/vuepress-plugin-flexsearch

将两个 json 发布到了 github pages,一些基本的加载时间测试

拼接: https://tts.liuli.moe/{index.json/meta.json} 可以下载这两块内容

文件 gzip 尺寸 加载时间
index.json 3M 3.19s
meta.json 2.2M 4.75s
rxliuli commented 1 year ago

实现了非常基本的搜索支持,分词❌,服务端❌,bug✅

image

rxliuli commented 1 year ago

https://github.com/liuli-moe/to-the-stars/issues/23 中一起解决了