Unified semantic and hybrid search across multiple embedding features with configurable fusion strategies
The Feature Search stage is the primary search stage for retrieval pipelines. It performs vector similarity search across one or more embedding features, supporting single-modal, multimodal, and hybrid search patterns. Results from multiple searches are fused using configurable strategies (RRF, DBSF, weighted, max, or learned).
Stage Category: FILTER (Retrieves documents)Transformation: 0 documents → N documents (retrieves from collection based on vector similarity)
Multi-content — embed multiple files together in one API call. Only valid when the feature_uri points to an extractor whose vector index has supports_multi_query=True (currently: gemini_multifile_extractor). Attempting this with any other feature URI returns a 400 error.
Each item in values is auto-detected: URLs (http://, https://, s3://) are fetched and embedded as files; all other strings are embedded as text. All items are passed to the underlying model in one call, producing a single query vector that mirrors how objects were indexed.
When searching with large files (videos, PDFs, long documents) as input, query_preprocessing decomposes the file into chunks using the same extractor pipeline that indexed your data, runs parallel searches for each chunk, and fuses the results.This is ingestion applied to the query — same decomposition and embedding, but vectors are used for search instead of storage.
Parameter
Type
Default
Description
feature_uri
string
null
Extractor pipeline for decomposition (inherits from search feature_uri if not set)
params
object
null
Extractor parameters — identical schema to the collection’s extractor config for that feature_uri
max_chunks
integer
20
Max chunks to search (1-100). Each chunk = 1 credit
aggregation
string
rrf
Fusion strategy: rrf, max, or avg
dedup_field
string
null
Field to deduplicate results by
params uses the extractor’s own parameter schema. Whatever parameters the extractor accepts during ingestion (e.g. split_method, time_split_interval for video; chunk_size, chunk_overlap for text) are the same parameters you pass here. There is no separate preprocessing-specific schema — the extractor drives the decomposition exactly as it would during collection processing. Refer to the extractor’s own documentation for valid parameter names.
You can also set query_preprocessing at the stage level (on parameters) to apply it to all searches as a default. Per-search settings override the stage default.
Aggregation strategies:
Strategy
Best For
How It Works
rrf
General purpose (recommended)
Rank-based fusion, immune to score magnitude differences
Preprocessing uses the same extractor pipeline that indexed your data. The params accept the same fields you configured on your collection’s feature extractor (e.g., split_method, chunk_size). If you don’t specify params, extractor defaults are used.
The response includes preprocessing metadata showing what happened:
For best performance, use pre-filters to reduce the search space. Filtering at the vector index level is much faster than post-filtering in later stages.
The following is a complete working example of creating a retriever that uses the feature_search stage, then executing it. Pay close attention to the field names — several are easy to confuse.
Common mistakes:
Use collection_identifiers (not collection_ids) in the retriever body.
Use type: "text" (not "string") in input_schema values.
stage_type at the outer level must be "filter".
stage_id: "feature_search" lives inside the config object, not at the outer stage_id.
final_top_k lives inside config.parameters, not at the top level.
The feature_uri must match an embedding index that exists in your namespace. To discover available feature URIs, list the vector indexes in a collection: