diff --git a/src/core/db.rs b/src/core/db.rs index 080e586..0873004 100644 --- a/src/core/db.rs +++ b/src/core/db.rs @@ -187,11 +187,19 @@ impl Database { .filter_map(Result::ok) .collect(); - // Sort by similarity (highest first) + // Sort by similarity (highest first), handling NaNs results.sort_by(|a, b| { - b.similarity - .partial_cmp(&a.similarity) - .unwrap_or(std::cmp::Ordering::Equal) + if b.similarity.is_nan() && a.similarity.is_nan() { + std::cmp::Ordering::Equal + } else if b.similarity.is_nan() { + std::cmp::Ordering::Less + } else if a.similarity.is_nan() { + std::cmp::Ordering::Greater + } else { + b.similarity + .partial_cmp(&a.similarity) + .unwrap_or(std::cmp::Ordering::Equal) + } }); results.truncate(limit * 3); // Get more for reranking diff --git a/src/core/search.rs b/src/core/search.rs index 1690ba4..7e1f24e 100644 --- a/src/core/search.rs +++ b/src/core/search.rs @@ -78,11 +78,19 @@ impl SearchEngine { }) .collect(); - // Sort by score descending + // Sort by score descending, handling NaNs by pushing them to the end results.sort_by(|a, b| { - b.score - .partial_cmp(&a.score) - .unwrap_or(std::cmp::Ordering::Equal) + if b.score.is_nan() && a.score.is_nan() { + std::cmp::Ordering::Equal + } else if b.score.is_nan() { + std::cmp::Ordering::Less + } else if a.score.is_nan() { + std::cmp::Ordering::Greater + } else { + b.score + .partial_cmp(&a.score) + .unwrap_or(std::cmp::Ordering::Equal) + } }); results.truncate(max_results);