diff --git a/python/python/lancedb/query.py b/python/python/lancedb/query.py index 60c5d0c68..095a7b5ff 100644 --- a/python/python/lancedb/query.py +++ b/python/python/lancedb/query.py @@ -2697,7 +2697,7 @@ class LanceHybridQueryBuilder(LanceQueryBuilder): self._fts_query.phrase_query(True) if self._distance_type: self._vector_query.metric(self._distance_type) - if self._minimum_nprobes: + if self._minimum_nprobes is not None: self._vector_query.minimum_nprobes(self._minimum_nprobes) if self._maximum_nprobes is not None: self._vector_query.maximum_nprobes(self._maximum_nprobes) diff --git a/python/python/tests/test_hybrid_query.py b/python/python/tests/test_hybrid_query.py index aa3e3f5fd..65a7890bf 100644 --- a/python/python/tests/test_hybrid_query.py +++ b/python/python/tests/test_hybrid_query.py @@ -123,6 +123,19 @@ async def test_async_hybrid_query_default_limit(table: AsyncTable): assert texts.count("a") == 1 +def test_hybrid_query_minimum_nprobes_zero_raises(sync_table: Table): + # minimum_nprobes(0) must raise the same validation error a plain vector + # query raises, not silently no-op because 0 is falsy. + with pytest.raises(ValueError, match="minimum_nprobes must be greater than 0"): + ( + sync_table.search(query_type="hybrid") + .vector([0.0, 0.4]) + .text("dog") + .minimum_nprobes(0) + .to_arrow() + ) + + def test_hybrid_query_distance_range(sync_table: Table): reranker = RRFReranker(return_score="all") result = (