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次 下载
40KB
523 行
tinysearch
tinysearch 是一个轻量级、快速的全文搜索引擎。它专为静态网站设计。
tinysearch 使用 Rust 编写,然后编译成 WebAssembly 在浏览器中运行。
它可以与 Jekyll、Hugo、Zola、Cobalt 或 Pelican 等静态网站生成器一起使用。
它真的很小吗?
我的博客测试索引文件(约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可以在以下任一许可证下使用:
- Apache License,版本2.0,(LICENSE-APACHE或https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证 (LICENSE-MIT或http://opensource.org/licenses/MIT)
任选其一。
依赖项
~0.7–10MB
~111K SLoC