#search-index #search-engine #search #in-memory #terms #permissions #similarity

searchy

基于词袋模型的搜索索引(内存中),可以使用 tf-idf 基于余弦相似度评分进行构建和搜索。支持多个搜索词、权限、文本建议(用于拼写错误)以及直接将常用算术表达式评估为值。试图减少内存占用。

8 个不稳定版本 (3 个重大更改)

0.4.0 2024年5月3日
0.3.0 2023年12月10日
0.2.2 2023年4月28日
0.2.1 2023年3月25日
0.1.1 2022年5月29日

#52 in 数据库实现

Download history 144/week @ 2024-04-29 6/week @ 2024-05-20 2/week @ 2024-05-27 20/week @ 2024-07-01

每月下载量 447 次

Apache-2.0

520KB
11K SLoC

searchy:一个可嵌入的内存搜索引擎

基于词袋模型的搜索索引(内存中),可以使用 tf-idf 基于余弦相似度评分进行构建和搜索。支持多个搜索词、权限、文本建议(用于拼写错误)以及直接将常用算术表达式评估为值。试图减少内存占用。

特性

  • 表达式评估(1+2 将得到 3);
  • 使用两个分配(在构建索引后)的小内存表示;
  • 易于 delta 更新;
  • 基于搜索索引的拼写建议;
  • 搜索结果中的摘要句子(基于 Luhn);
  • 基于组的过滤结果(基于角色访问控制)。

最小示例

use searchy::*;
use expry::*;

// MemoryPool avoids small allocations.
pool!(scope);

// Add documents
let mut builder = SearchBuilder::new();
let doc_id = builder.add_document("foo bar text", "url", "name", "group1", b"extra", &mut scope);
// doc_id can be used to later remove the document from the search index

// Build search index
let index : SearchIndex = builder.into();
// Roles are access groups of the user. The search documents have access groups and are are filtered based on the access group of the current user. 
const MAX_DOCS_RETRIEVED : usize = 1024;
let results = index.search("query text", "group1,group2", MAX_DOCS_RETRIEVED);
eprintln!("RESULTS: {}x/{} in {}ms", results.docs, results.more, results.duration);
for ScoredDocumentInfo{doc_id: _, score, info} in results.entries {
  eprintln!("{} -> {}, {}, {}", score, info.name, info.url, info.summary);
}

// do some mutations to the search index
let mut builder = SearchBuilder::from(index);
builder.remove_document(doc_id);

依赖