#search-engine #search #search-query #index #full-text-search #query #text-search

probly-search

一个轻量级的全文搜索引擎,具有完全可定制的评分函数

12 个版本 (稳定)

2.0.1 2024 年 7 月 3 日
2.0.0 2024 年 2 月 8 日
2.0.0-alpha-22023 年 1 月 5 日
2.0.0-alpha-12022 年 8 月 12 日
0.1.1 2021 年 6 月 6 日

#83 in 文本处理

Download history 65/week @ 2024-05-03 205/week @ 2024-05-10 258/week @ 2024-05-17 256/week @ 2024-05-24 156/week @ 2024-05-31 244/week @ 2024-06-07 389/week @ 2024-06-14 202/week @ 2024-06-21 344/week @ 2024-06-28 287/week @ 2024-07-05 247/week @ 2024-07-12 340/week @ 2024-07-19 247/week @ 2024-07-26 230/week @ 2024-08-02 225/week @ 2024-08-09 256/week @ 2024-08-16

1,033 每月下载量
4 个 Crates 中使用 (通过 sos-sdk)

MIT 许可证

71KB
1.5K SLoC

probly-search · GitHub license Coverage Status Latest Version PRs Welcome

一个全文搜索库,用 Rust 编写,针对插入速度优化,提供对评分计算的完全控制。

此项目最初是 Node 库 NDX 的移植。

演示

50k 文档的标题/标签搜索。

https://quantleaf.github.io/probly-search-demo/

特性

  • 三种评分方式

    • BM25 排名函数用于排名匹配文档。与 Lucene >= 6.0.0 默认使用的相同排名函数。
    • zero-to-one,一个独特的库评分函数,提供介于 0 和 1 之间的标准化分数。非常适合匹配标题/标签和查询。
    • 通过实现 ScoreCalculator trait,您可以完全自定义自己的评分函数。
  • 基于 Trie 的动态 倒排索引

  • 多个字段全文索引和搜索。

  • 字段级评分提升。

  • 可配置的分词器。

  • 带有查询扩展的自由文本查询。

  • 快速分配,但存在潜在删除。

  • 兼容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
    }
);

查看BM25实现零到一实现以获取更多查询示例。

测试

使用以下命令运行所有测试

cargo test

基准测试

使用以下命令运行所有基准测试

cargo bench

许可证

MIT

依赖项

约4MB
约72K SLoC