lunrjs,pure JavaScript-based、client side,原理是所谓的 inverted index,即倒挂索引、反向索引,关于 inverted index 的简单科普可以看这篇文章。
简单点说,在你希望使用全文搜索的页面引入 lunrjs,然后把这个页面的内容都传入 lunrjs,让它生成一个 inverted index,搜索的时候,就是调用 lunrjs 搜索这个 inverted index。生成索引、对索引进行搜索,都是在浏览器进行。这意味着如果你想搜索一个博客的所有文章,你就需要先让浏览器把所有文章都请求下来,并在浏览器对所有文章建立倒挂索引,所以 lunrjs 不太适合大博客。如果你只是想搜索当前页面的内容,lunrjs 无疑是适合的,因为当前页面的内容已经打开了,例如这个页面。
Elasticsearch 是全文搜索的大玩家之一,它也是基于倒挂检索实现全文搜索的,不过它是提前生成检索并保存在服务器,而不是让浏览器即时生成,这也意味着用户每一次检索都要发起网络请求。
Algolia 和 Elasticsearch 是同一类产品,此外还有 ZincSearch、meilisearch。lunrjs 自称类似 Solr,但体积小得多、没那么聪明,而且 Solr 和 Elasticsearch 一样是服务端搜索。lunrjs 没有自称类似 Elasticsearch 或 Algolia,因为后两者的功能更丰富,应用场景也更广泛,可能就像飞机和汽车的区别吧,都是交通工具,但差异很大。
有网站一开始用 lunrjs,后来改用 Elasticsearch,可以打开这篇文章看看它的理由。
tinysearch 也是一个客户端全文搜索工具,作者不是很喜欢 lunrjs 使用 js 去做索引生成和搜索的工作,他觉得静态博客应该尽量少 js,而且 js 也慢,于是他用 rust 写了 tinysearch,打包成 WebAssembly 在浏览器运行。
另外 lunrjs 的索引数据结构是倒挂索引,而 tinysearch 用的是所谓的 Bloom Filter,这篇文章描述了为什么用 Bloom Filter 而不是 Inverted Index 去索引文章,主要原因还是希望可以降低发送到浏览器的数据体积。尽管如此,tinysearch 作者表示每篇文章大概会生成 4KB 的索引,1000 篇文章就大概要生成 4MB 的索引,gzip 后会小一些,但还是太大了,所以作者表示 tinysearch 只适合小博客。
stork 是另一个使用 WebAssembly 的静态博客全文搜索工具。
Fuse.js 也是比较多人使用的客户端全文搜索工具,它也是基于 inverted index,它的主要特色是模糊搜索,即 fuzzy search,但可能会给出不精确的结果。μFuzzy 是另一个模糊搜索工具。
虽然 lunr.js、tinysearch、fuse.js 的本意都是客户端搜索,但你完全可以把它们用在后端,用它们生成索引,前端搜索时发起网络请求,后端用它们从索引中搜索内容,最后返回匹配的结果。
不是很清楚以上搜索对中文的支持,有人说 meilisearch 对中文友好,它是服务端搜索,有人建议 10TB 的内容也可以用它去做搜索。
对于服务端搜索,如果文章都保存在数据库,其实也可以直接搜索数据库。
相关文章: