12 个版本 (稳定)
2.0.1 | 2024 年 7 月 3 日 |
---|---|
2.0.0 | 2024 年 2 月 8 日 |
2.0.0-alpha-2 | 2023 年 1 月 5 日 |
2.0.0-alpha-1 | 2022 年 8 月 12 日 |
0.1.1 | 2021 年 6 月 6 日 |
#83 in 文本处理
1,033 每月下载量
在 4 个 Crates 中使用 (通过 sos-sdk)
71KB
1.5K SLoC
probly-search ·
一个全文搜索库,用 Rust 编写,针对插入速度优化,提供对评分计算的完全控制。
此项目最初是 Node 库 NDX 的移植。
演示
50k 文档的标题/标签搜索。
https://quantleaf.github.io/probly-search-demo/
特性
-
三种评分方式
-
多个字段全文索引和搜索。
-
字段级评分提升。
-
可配置的分词器。
-
带有查询扩展的自由文本查询。
-
快速分配,但存在潜在删除。
-
兼容WASM
文档
添加、删除和搜索文档
查看集成测试。
使用WASM与该库结合使用
查看食谱搜索演示项目
一个基本示例
使用具有2个字段的文档创建索引。查询文档,并删除文档。
use std::collections::HashSet;
use probly_search::{
index::Index,
query::{
score::default::{bm25, zero_to_one},
QueryResult,
},
};
// A white space tokenizer
fn tokenizer(s: &str) -> Vec<Cow<str>> {
s.split(' ').map(Cow::from).collect::<Vec<_>>()
}
// We have to provide extraction functions for the fields we want to index
// Title
fn title_extract(d: &Doc) -> Vec<&str> {
vec![d.title.as_str()]
}
// Description
fn description_extract(d: &Doc) -> Vec<&str> {
vec![d.description.as_str()]
}
// Create index with 2 fields
let mut index = Index::<usize>::new(2);
// Create docs from a custom Doc struct
let doc_1 = Doc {
id: 0,
title: "abc".to_string(),
description: "dfg".to_string(),
};
let doc_2 = Doc {
id: 1,
title: "dfgh".to_string(),
description: "abcd".to_string(),
};
// Add documents to index
index.add_document(
&[title_extract, description_extract],
tokenizer,
doc_1.id,
&doc_1,
);
index.add_document(
&[title_extract, description_extract],
tokenizer,
doc_2.id,
&doc_2,
);
// Search, expected 2 results
let mut result = index.query(
&"abc",
&mut bm25::new(),
tokenizer,
&[1., 1.],
);
assert_eq!(result.len(), 2);
assert_eq!(
result[0],
QueryResult {
key: 0,
score: 0.6931471805599453
}
);
assert_eq!(
result[1],
QueryResult {
key: 1,
score: 0.28104699650060755
}
);
// Remove documents from index
index.remove_document(doc_1.id);
// Vacuum to remove completely
index.vacuum();
// Search, expect 1 result
result = index.query(
&"abc",
&mut bm25::new(),
tokenizer,
&[1., 1.],
);
assert_eq!(result.len(), 1);
assert_eq!(
result[0],
QueryResult {
key: 1,
score: 0.1166450426074421
}
);
测试
使用以下命令运行所有测试
cargo test
基准测试
使用以下命令运行所有基准测试
cargo bench
许可证
依赖项
约4MB
约72K SLoC