8 个版本

0.2.2 2019 年 5 月 24 日
0.2.1 2019 年 4 月 28 日
0.1.4 2019 年 4 月 15 日

#826 in 数据结构

Apache-2.0/MIT

7KB
70

tinysearch

Logo

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 所需的内容 托管 WebAssembly -- 您需要显式设置 gzip MIME 类型。

Docker

如果您没有可用的完整 Rust 设置,您也可以使用我们构建的 nightly 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 映像。要获取 nightly,请运行

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 action

为了将 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 在以下任一许可证下授权:

任选其一。

依赖项

~2.1–3.5MB
~64K SLoC