Hybrid Search
Hybrid search runs both full-text and semantic search in parallel, then merges the results. This gives you exact keyword matches alongside conceptually related content, producing the most comprehensive results.How it works
- Your query is sent to both search engines simultaneously.
- Full-text search matches against
sessions.searchableTextusing Convex’s search indexes. - Semantic search converts the query to an embedding and matches against
sessionEmbeddingsusing cosine similarity. - Results are merged using reciprocal rank fusion (RRF).
- A session found by both searches receives contributions from both ranks.
1 / (60 + rank) to the session’s score. The score orders results internally and is not included in the REST response.
When to use hybrid search
Hybrid search is the default recommendation for RAG and context injection workflows because it catches both exact matches and related content.
Using in the dashboard
The Context tab in the dashboard supports a hybrid mode:- Open the Context tab.
- Select Hybrid as the search type.
- Enter your query.
- Results show combined rankings with scores from both engines.
Using via API
results array. See the API reference for the returned fields; the REST API does not return snippets or relevance scores.
Hybrid results may use id or _id depending on which search path found the session. Normalize with result.id ?? result._id.
Use case: RAG pipeline
Hybrid search is ideal for Retrieval-Augmented Generation because it retrieves both precise matches (from full-text) and conceptually related context (from semantic):/api/context endpoint uses semantic search internally and returns results formatted for LLM prompt injection.
Example RAG flow
- User asks a question in your application.
- Your backend queries
/api/contextwith the user’s question. - The top results are injected into the system prompt.
- The LLM responds with knowledge from your past sessions.
Comparison
Requirements
Hybrid search requires:- OpenAI API key (for the semantic component)
- Embeddings generated for your sessions
type=fulltext when embeddings are unavailable; the REST endpoint does not automatically fall back.