Perpustakaan pencarian teks lengkap, ditulis dalam karat, dioptimalkan untuk kecepatan penyisipan, yang memberikan kontrol penuh atas perhitungan penilaian.
Ini awalnya awalnya sebagai port dari pustaka node NDX.
Resep (judul) Cari dengan 50k dokumen.
https://quantleaf.github.io/probly-search-demo/
Tiga cara untuk melakukan skor
ScoreCalculator .Indeks Terbalik Dinamis Berbasis Trie.
Beberapa bidang pengindeksan dan pencarian teks lengkap.
Peningkatan skor per-lapangan.
Tokenizer yang dapat dikonfigurasi.
Kueri teks gratis dengan ekspansi kueri.
Alokasi cepat, tetapi penghapusan laten.
Kompatibel WASM
Lihat Tes Integrasi.
Lihat Proyek Demo Pencarian Resep
Membuat indeks dengan dokumen yang memiliki 2 bidang. Dokumen permintaan, dan hapus dokumen.
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
}
) ;Pergi melalui tes sumber untuk implementasi BM25 dan implementasi nol-ke-satu untuk lebih banyak contoh kueri.
Jalankan semua tes dengan
cargo testJalankan semua tolok ukur dengan
cargo benchMit