Skip to content

小型静态站(包含中文内容)全文搜索方案研究 #1

Open

Description

@ben7th

方案一:

lunr.js / jekyll-lunr-js-search
https://github.com/slashdotdash/jekyll-lunr-js-search

此方案通过 jekyll 插件,自动给所有文档生成索引文件,保存成一个 json 放置在工程目录下。前端每次执行搜索动作时,都访问这个 json,然后使用 lunr.js 执行搜索动作。

虽然 lunr.js 不支持中文(其实是所有非英语的 UTF-8 字符),但是可以通过简单修改来支持。
但是,这种方案缺点很大,主要有以下几点:

  1. 针对中文生成的索引文件太大,当文章较多时,能达到 4-5 MB 的大小。
    事实上 github help 的搜索索引文件就有 5 MB 之大。(看 chrome 的请求可知)
    当带宽不高,或者使用移动网络访问时,性能会很低下。
  2. jekyll-lunr-js-search 的索引策略并不科学。它只是弄了一个很呆板的索引 jekyll 的常用主要信息字段的索引方式。而很多小型静态站并没有必要这样索引。

方案二:

使用 elastic-search 生成索引,并把索引部署到某个网址作为服务来使用。
这种方式的可行性是有的,工作性能也是很好的。

唯一缺点在于部署和发布起来很繁琐,架构复杂。做起来比较费时间。
我们做小型静态站本身就是为了省时间。用这种方案会本末倒置。


方案三:

自己按需编写简单的小型索引方案。
目前正按此尝试。

Activity

  1. cxumol commented on Sep 8, 2017

    @cxumol

    必须要全文索引, 除非不想要全文搜索.

    之前不了解搜索是怎么回事, 找来找去, 有了一点初步概念. 以我目前的理解, 搜索就是先做好索引, 接收关键字后到索引中查, 生成搜索结果返回了. 现在 js 这么发达, 都可以直接在前端生成搜索结果, 关键还是这个索引怎么搞.

    一个是纯前端。索引生于浏览器,存于浏览器,这是坠前的。
    比如 docsify的搜索插件.
    缺点, 浏览器对每个站点的 LocalStorage 存储有限, 比如 Chrome 5MB 封顶.

    另一个思路和楼主说的方案一类似, "编译"静态站内容的同时, 生成索引文件. 这里大家都爱用 json 或 xml 文件当索引. 比如 python 钦定了大家都用 sphinx 写文档, 以及 Hexo 某些中文主题, 比如 fexo , NexT. (因为我以前 Hexo 用的多, 只看了Hexo生态的.)

    对一个没钱搞服务器, 更不会 SQL 的人来说, 太可怜了...

    现在我的解决方案是,基于 某个 Hexo 主题中搜索的 js 小小的修改了下; 他有个配套生成 json 索引的东西, nodejs 写的. 我一点都不想用 npm 误装一大堆有的没的, 直接用py脚本写个生成脚本, 仿照了它导出的 json 格式, 这样就好了.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions