A keyword engine loses the shopper who types «something warm for hiking». A vector engine loses the one who types an exact SKU. AACSearch runs both retrievers inside a single search call and fuses the two lists, so neither query ends on an empty page — and you can see, per hit, which side found it.
Declare a vector field in the collection schema and name the text fields it is built from. Embeddings are generated server-side when a document is indexed.
List the text fields and the embedding field in query_by. The same request returns one fused, ranked list — filters and facets apply to both sides.
Set alpha to decide how much the vector score counts, switch on reranking for the leading hits, and compare nDCG on a golden query set before shipping the change.
Catalogue traffic is a mix. Navigational queries — a brand, a model number, a part code — need exact lexical matching, and a vector index will happily return something «similar» instead of the item asked for. Descriptive queries — «quiet dishwasher for a small kitchen» — share almost no words with the product card and only match by meaning.
Hybrid retrieval keeps both behaviours. Documents that the keyword and the vector retriever agree on rise to the top; a document only one of them found still gets a respectable fused score. Because reciprocal rank fusion works on ranks rather than raw scores, there is no score calibration to maintain per collection.
Send debug=true and every hit carries an _explain object with its scoring signals, while the response carries a _trace of what the platform did to the request. Hybrid hits also report hybrid_search_info, so «why is this product first?» is answered from the response rather than guessed.
OpenAI, Google or a built-in model — configured in the schema, so your application never calls an embedding model itself.
Reciprocal rank fusion is the default merge; alpha in vector_query shifts the balance when a collection needs it.
filter_by, facet_by and sort_by work the same in keyword, vector and hybrid mode — stock and price filters never drift apart.
rerank: true sends the leading hits through a cross-encoder; if the model times out the engine order is returned, never an error.
New to the term? The glossary explains Hybrid search from first principles.
{
"q": "something warm for hiking",
"query_by": "name,description,embedding",
"vector_query": "embedding:([], alpha: 0.6)",
"filter_by": "in_stock:true",
"rerank": true,
"debug": true
}
// -> hits[].hybrid_search_info, hits[]._explain, rerank: { "applied": true }Explore more
The best way to evaluate a search platform isn't reading one more comparison table.
Only then make the decision.