Raise matching floor: boundary tokenizer, stemming/folding/stopwords, boosts, snippets, engine seam

This commit is contained in:
George Coles
2026-09-15 08:11:55 -04:00
parent 0d35036168
commit 382acc36a9
10 changed files with 294 additions and 42 deletions
+13 -7
View File
@@ -102,17 +102,23 @@ pub struct ResponseBody {
pub fn build_response(
qid: &str,
hits: Vec<ResponseItem>,
total: u64,
total: Option<u64>,
max_results: usize,
) -> ResponseBody {
let max_results = max_results.max(1);
let mut results = hits;
results.truncate(max_results);
let more_available = total.saturating_sub(results.len() as u64);
let (truncated, more_available) = match total {
Some(total) => {
let more = total.saturating_sub(results.len() as u64);
(more > 0, more)
}
None => (true, 0),
};
ResponseBody {
qid: qid.to_string(),
results,
truncated: more_available > 0,
truncated,
more_available,
cursor: None,
}
@@ -153,24 +159,24 @@ mod tests {
#[test]
fn max_results_is_respected() {
let response = build_response("q1", vec![item(1), item(2), item(3)], 10, 2);
let response = build_response("q1", vec![item(1), item(2), item(3)], Some(10), 2);
assert_eq!(response.results.len(), 2);
}
#[test]
fn truncation_is_honest() {
let response = build_response("q1", vec![item(1), item(2), item(3)], 10, 2);
let response = build_response("q1", vec![item(1), item(2), item(3)], Some(10), 2);
assert!(response.truncated);
assert_eq!(response.more_available, 8);
let response = build_response("q2", vec![item(1), item(2)], 2, 5);
let response = build_response("q2", vec![item(1), item(2)], Some(2), 5);
assert!(!response.truncated);
assert_eq!(response.more_available, 0);
}
#[test]
fn response_carries_no_scores() {
let response = build_response("q1", vec![item(1)], 1, 5);
let response = build_response("q1", vec![item(1)], Some(1), 5);
let json = serde_json::to_string(&response).unwrap();
assert!(!json.contains("score"));
assert!(!json.contains("relevance"));