A lightweight full-text search library that provides full control over the scoring calculations.
This start initially as a port of the Node library NDX.
Three ways to do scoring
ScoreCalculator
trait. Trie based dynamic Inverted Index.
Documentation is under development. For now read the source tests.
Creating an index with a document that has 2 fields. Then indexing two documents and query for one using the BM25 scoring function ```rust use std::collections::HashSet; use problysearch::{ index::{adddocumenttoindex, createindex, removedocumentfromindex, Index}, query::{ query, score::default::{bm25, zerotoone}, QueryResult, }, };
// Create index with two fields
let mut idx: Index
// Create docs from a custom Doc struct struct Doc { id: usize, title: String, description: String, }
let doc1 = Doc { id: 0, title: "abc".tostring(), description: "dfg".to_string(), };
let doc2 = Doc { id: 1, title: "dfgh".tostring(), description: "abcd".to_string(), };
// Add documents to index
fn tokenizer(s: &str) -> Vec
fn descriptionextract(d: &Doc) -> Option<&str> { Some(d.description.asstr()) }
fn filter(s: &String) -> String { s.to_owned() }
adddocumenttoindex( &mut idx, &[titleextract, descriptionextract], tokenizer, filter, doc1.id, doc_1.clone(), );
adddocumenttoindex( &mut idx, &[titleextract, descriptionextract], tokenizer, filter, doc2.id, doc_2, );
// Search, expect 2 results let mut result = query( &mut idx, &"abc", &mut bm25::new(), tokenizer, filter, &[1., 1.], None, ); asserteq!(result.len(), 2); asserteq!( result[0], QueryResult { key: 0, score: 0.6931471805599453 } ); assert_eq!( result[1], QueryResult { key: 1, score: 0.28104699650060755 } ); ```
Go through source tests in for the BM25 implementation and zero-to-one implementation for more query examples.