{"record":{"id":"b7644a6a70dcb55f","repo":"apache/beam","slug":"ranker-must-be-provided-for-hybrid-search","errorCode":null,"errorMessage":"Ranker must be provided for hybrid search","messagePattern":"Ranker must be provided for hybrid search","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"sdks/python/apache_beam/ml/rag/enrichment/milvus_search.py","lineNumber":204,"sourceCode":"    limit: Maximum number of results to return per query. Defaults to 3 search\n      results.\n    kwargs: Optional keyword arguments for additional hybrid search parameters.\n      Enables forward compatibility.\n  \"\"\"\n  vector: VectorSearchParameters\n  keyword: KeywordSearchParameters\n  ranker: MilvusBaseRanker\n  limit: int = 3\n  kwargs: dict[str, Any] = field(default_factory=dict)\n\n  def __post_init__(self):\n    if not self.vector or not self.keyword:\n      raise ValueError(\n          \"Vector and keyword search parameters must be provided for \"\n          \"hybrid search\")\n\n    if not self.ranker:\n      raise ValueError(\"Ranker must be provided for hybrid search\")\n\n    if self.limit <= 0:\n      raise ValueError(f\"Search limit must be positive, got {self.limit}\")\n\n\nSearchStrategyType = Union[VectorSearchParameters,\n                           KeywordSearchParameters,\n                           HybridSearchParameters]\n\n\n@dataclass\nclass MilvusSearchParameters:\n  \"\"\"Parameters configuring Milvus search operations.\n\n  This class encapsulates all parameters needed to execute searches against\n  Milvus collections, supporting vector, keyword, and hybrid search strategies.\n\n  Args:","sourceCodeStart":186,"sourceCodeEnd":222,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/python/apache_beam/ml/rag/enrichment/milvus_search.py#L186-L222","documentation":"Hybrid search must know how to fuse vector and keyword result lists, so HybridSearchParameters requires a `ranker` (e.g. RRFRanker or WeightedRanker). __post_init__ raises ValueError when the ranker field is falsy (None or not provided).","triggerScenarios":"HybridSearchParameters(vector=..., keyword=...) constructed without passing a ranker instance, or ranker=None explicitly.","commonSituations":"Following older Milvus API examples where the ranker was optional; forgetting to import pymilvus ranker classes; passing the ranker class instead of an instance.","solutions":["Pass a ranker instance, e.g. ranker=RRFRanker() or WeightedRanker(0.7, 0.3).","Import the ranker from pymilvus (pymilvus.model.reranker or milvus hybrid-search API) and instantiate it.","Ensure you pass an instance, not the class (RRFRanker, not RRFRanker)."],"exampleFix":"// before\nparams = HybridSearchParameters(vector=v, keyword=k)  # ranker missing\n// after\nparams = HybridSearchParameters(vector=v, keyword=k, ranker=RRFRanker())","handlingStrategy":"validation","validationCode":"from pymilvus.model.reranker import RRFRanker\nassert ranker is not None, 'Hybrid search requires a ranker instance'","typeGuard":null,"tryCatchPattern":"try:\n    params = HybridSearchParameters(vector=v, keyword=k, ranker=ranker)\nexcept ValueError as e:\n    logging.error('Hybrid search params invalid: %s', e)\n    raise","preventionTips":["Always pass an instantiated ranker (RRFRanker(), WeightedRanker(...)), not the class.","Import rankers from pymilvus explicitly in retrieval modules.","Set ranker choice in config alongside the hybrid flag."],"tags":["python","milvus","rag","hybrid-search","config"],"backgroundTag":"missing-required-argument","analyzedSha":"12126d8942aaf848030c478b4c6a28c6af861c66","analyzedAt":"2026-09-13T01:50:10.254Z","contentChangedAt":"2026-09-13T01:50:10.254Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}