Una biblioteca de búsqueda de texto completo, escrita en Rust, optimizada para la velocidad de inserción, que proporciona un control total sobre los cálculos de puntuación.
Esto comienza inicialmente como un puerto de la biblioteca de nodo NDX.
Receta (título) Búsqueda con 50k documentos.
https://quantleaf.github.io/probly-search-demo/
Tres formas de hacer la puntuación
ScoreCalculator .Índice dinámico invertido basado en Trie.
Múltiples campos indexación y búsqueda de texto completo.
Aumento de puntaje por campo.
Tokenizer configurable.
Consultas de texto gratuito con expansión de la consulta.
Asignación rápida, pero eliminación latente.
Wasm compatible
Ver pruebas de integración.
Ver Proyecto de demostración de búsqueda de recetas
Creación de un índice con un documento que tenga 2 campos. Documentos de consulta y eliminar un documento.
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
}
) ;Realice pruebas fuente para la implementación BM25 y la implementación de cero a uno para más ejemplos de consultas.
Ejecutar todas las pruebas con
cargo testEjecutar todos los puntos de referencia con
cargo benchMIT