15 个版本

0.8.2 2023年7月26日
0.7.0 2022年9月27日
0.6.3 2021年12月29日
0.6.2 2021年8月23日
0.3.1 2019年5月24日

#375 in 数据库实现

每月47次 下载

Apache-2.0/MIT

40KB
523

tinysearch

CI

tinysearch 是一个轻量级、快速的全文搜索引擎。它专为静态网站设计。

tinysearch 使用 Rust 编写,然后编译成 WebAssembly 在浏览器中运行。
它可以与 Jekyll、Hugo、Zola、Cobalt 或 Pelican 等静态网站生成器一起使用。

Demo

它真的很小吗?

我的博客测试索引文件(约40篇帖子)创建了一个99KB的WASM有效负载(49KB gzipped,40KB brotli)。
这比上面的演示图像要小;所以是的。

工作原理

tinysearch 是从文章 "使用 Bloom 过滤器编写全文搜索引擎" 中的 Python 代码移植到 Rust/WASM 的。它可以看作是 lunr.js 和 elasticlunr 的替代品,它们对于较小的网站来说太重了,并且加载了大量的 JavaScript。

底层使用 Xor Filter —— 一种比 bloom 过滤器和 cuckoo 过滤器更小的数据结构,用于快速近似集合成员资格。每个博客帖子都会转换成一个过滤器,然后使用 bincode 序列化为二进制 blob。请注意,底层技术可能会发生变化。

限制

  • 只能找到完整的单词。因此,目前没有搜索建议。这是为了减少内存使用而必要的权衡。Trie 数据结构比 Xor 过滤器大约大10倍。未来关于前缀搜索的紧凑数据结构的新研究可能会解除这一限制。
  • 由于我们将所有文章的搜索索引打包成一个静态的二进制文件,我们建议仅将其用于中小型网站。每篇文章大约需要2 kB的未压缩空间(约1 kb压缩)。

安装

需要wasm-pack来构建WASM模块。使用以下命令安装它:

cargo install wasm-pack

为了优化JavaScript输出,您还需要terser

npm install terser -g

如果您希望将WebAssembly尽可能缩小,我们还建议安装binaryen。在macOS上,您可以使用homebrew来安装它。

brew install binaryen

或者,您可以从发布页面下载二进制文件,或使用您的操作系统包管理器。

之后,您就可以安装tinysearch本身了。

cargo install tinysearch

使用方法

需要一个JSON文件作为输入,其中包含要索引的内容。请参考示例文件

ℹ️ JSON文档中的body字段是可选的,可以跳过仅索引帖子标题。

一旦创建了索引,您就可以运行以下命令:

tinysearch fixtures/index.json

这将创建一个WASM模块和用于将其集成到您的网站中的JavaScript粘合代码。您可以从任何网络服务器打开demo.html来查看结果。

例如,Python有一个内置的网络服务器,可用于快速测试

python3 -m http.server

然后浏览到http://0.0.0.0:8000/demo.html来运行演示。

您还可以在此查看不同静态网站生成器的代码示例。

高级使用方法

要使用高级选项,请运行

tinysearch --help

请检查在生产环境中托管WebAssembly所需的内容--您需要明确设置gzip MIME类型。

Docker

如果您没有完整的Rust设置,您也可以使用我们的夜间构建Docker镜像。

以下是使用Docker快速尝试tinysearch的方法

# Download a sample blog index from endler.dev
curl -O https://raw.githubusercontent.com/tinysearch/tinysearch/master/fixtures/index.json
# Create the WASM output
docker run -v $PWD:/app tinysearch/cli --engine-version path=\"/engine\" --path /app/wasm_output /app/index.json

默认情况下,使用最新的稳定Alpine Rust镜像。要获取夜间版本,请运行

docker build --build-arg RUST_IMAGE=rustlang/rust:nightly-alpine -t tinysearch/cli:nightly .

高级Docker构建参数

  • WASM_REPO:覆盖wasm-pack存储库
  • WASM_BRANCH:覆盖要使用的存储库分支
  • TINY_REPO:覆盖tinysearch存储库
  • TINY_BRANCH:覆盖tinysearch分支

GitHub动作

为了将tinysearch集成到持续部署管道中,有一个github action可用。

- name: Build tinysearch
  uses: leonhfr/tinysearch-action@v1
  with:
    index: public/index.json
    output_dir: public/wasm
    output_types: |
      wasm

用户

以下网站使用了tinysearch

您也在使用tinysearch吗?在这里添加您的网站!

维护者

  • Matthias Endler (@mre)
  • Jorge-Luis Betancourt (@jorgelbg)
  • Mad Mike (@fluential)

许可证

tinysearch可以在以下任一许可证下使用:

任选其一。

依赖项

~0.7–10MB
~111K SLoC