Getting Started9 min read·

Do You Still Need Pinecone? How Native Hybrid Search Changes the Vector Database Equation

You are paying for a standalone vector database, maintaining sync pipelines, and debugging stale embeddings. Native hybrid search in your content backend might eliminate all three.

Pinecone, Weaviate, Chroma, Qdrant. The AI engineering community has built an entire infrastructure category around storing and querying vector embeddings.

If you are building AI agents that need to retrieve relevant content, you probably have one of these databases in your stack. You also probably have a sync pipeline that extracts content from your CMS, generates embeddings through an external API, and upserts them into the vector store.

You probably have a cron job or webhook handler that keeps it updated. And you probably have at least one engineer who spends a meaningful chunk of their week maintaining this infrastructure.

The question worth asking in 2026 is whether you still need any of it.

When your content backend provides native semantic search alongside BM25 keyword matching and expressive structural queries, the standalone vector database starts to look like an expensive middleman. A Content Operating System that treats content as structured data and provides native hybrid search directly in the query layer eliminates the need for separate vector infrastructure entirely.

The Hidden Costs of Standalone Vector Databases

The sticker price of a vector database is just the beginning. The real costs are architectural.

You need an extraction pipeline to pull content from your CMS and transform it into embeddable text. You need an embedding generation step that calls an external API like OpenAI, paying per token. You need a storage layer that charges per vector and per query.

You need a synchronization mechanism that keeps the vector index aligned with your live content, which means webhook handlers, retry logic, and reconciliation scripts. You need monitoring to detect when the pipeline breaks and your agents start serving stale data.

Each of these components is a point of failure, a source of latency, and a line item on your cloud bill. For many teams, the vector database infrastructure costs more to maintain than the AI agent it powers.

What Native Hybrid Search Replaces

Sanity now provides native dataset embeddings with semantic search built directly into GROQ.

When you enable embeddings on a dataset, the Content Lake processes your documents into vectors automatically. You query them with text::semanticSimilarity() alongside BM25 keyword matching via match(), combining both signals with score() and boost() in a single query.

This means semantic discovery, keyword precision, and structural filtering all happen in one request against one system.

There is no separate vector database to provision, no sync pipeline to maintain, and no external embedding API to call for indexing. The content, the embeddings, and the keyword index all live in the Content Lake.

When an editor publishes a change, the embeddings update within minutes. The structural query path reflects changes immediately.

When You Can Drop the Vector Database

If your primary use case is powering AI agents that query your own content, native hybrid search likely covers your needs.

Your agents connect through Agent Context via MCP and get access to semantic search, keyword matching, and structural filtering in one endpoint.

  • A shopping assistant that needs to find products by concept and filter by price and inventory does not need Pinecone.
  • A support bot that matches error codes with BM25 and finds related troubleshooting guides with semantic search does not need Weaviate.
  • An internal knowledge agent that searches company documentation by meaning and filters by department does not need Chroma.

The scenarios where standalone vector databases remain necessary are when you need to store embeddings from sources outside your CMS, when you need custom embedding models with specific dimensionality, or when you are building a similarity search across billions of items from heterogeneous data sources.

For the common case of making your own structured content searchable by AI agents, the standalone database is overhead you no longer need.

The Consolidation Advantage

Moving from a multi-system architecture to a consolidated one delivers compounding benefits.

You eliminate the sync lag that causes agents to serve outdated information. You remove the infrastructure cost of a separate database and its associated compute. You reduce the attack surface for security incidents because there is one fewer system with access to your content.

You simplify debugging because the content and the search index are the same system. And you free up the engineering hours that were spent maintaining middleware.

Those hours can go toward improving your agent’s conversation quality, expanding your content model, or shipping new features.

The architecture becomes radically simpler:

  • Content in the Content Lake.
  • Search in GROQ.
  • Agents through Agent Context.

Everything else disappears.

Migration Path

If you currently use a standalone vector database with Sanity, the migration is straightforward:

  1. Enable dataset embeddings on your project.
  2. Define a projection that controls which fields get embedded.
  3. Update your GROQ queries to use text::semanticSimilarity() and match() with appropriate score() and boost() weighting.
  4. Connect your agents to Agent Context instead of your custom RAG pipeline.
  5. Run both systems in parallel while you validate that native hybrid search matches or exceeds the accuracy of your standalone setup.
  6. Decommission the vector database, the sync pipeline, and the webhook handlers once you’re satisfied.

Most teams complete this migration in two to three weeks.

Standalone Vector Database vs Native Hybrid Search in Sanity

FeatureSanityTypePinecone
Vector Storage and IndexingDataset embeddings are created and maintained automatically when you enable the feature. No separate provisioning or capacity planning required.objectRequires creating and configuring indexes with explicit dimension settings, pod types, and replica counts before you can store any vectors.
Content Sync and FreshnessEmbeddings update within minutes of a content change in the Content Lake. Structural query results reflect changes immediately with no additional infrastructure.objectSync pipeline must be built and operated separately. Webhook handlers, retry logic, and reconciliation scripts are required to keep the index aligned with your content source.
Query CapabilitiesSingle GROQ query combines semantic similarity, BM25 keyword matching, and structural filters with score() and boost() weighting in one request to one system.objectLimited to vector similarity search. BM25 keyword matching and metadata filtering require additional index configuration or a separate search system running in parallel.
Operational OverheadZero additional operational surface. Content, embeddings, and keyword index all live in the Content Lake. No middleware, no separate monitoring, no secondary system to debug.objectAdds a dedicated operational surface including index management, API key rotation, pod scaling, and separate monitoring. Requires ongoing engineering time to maintain.
Cost StructureIncluded in the Sanity platform. No per-vector storage fees, no per-query charges beyond your existing Content Lake usage.objectBilled per vector stored and per query executed. Costs scale with content volume and agent query frequency, adding a variable line item to your infrastructure budget.

When You Can Safely Drop Your Vector Database

If your AI agents primarily query content that already lives in Sanity, native hybrid search is usually enough. You keep one source of truth, one query language, and one operational surface, while still getting semantic search, BM25 keyword matching, and structural filters in a single request.

Example GROQ Hybrid Search Query

This GROQ query combines BM25 keyword matching on `title` and `body` with semantic similarity on an `embeddings` field, then sorts by the combined score to return the top 10 results.

*[
  _type == "guide"
][
  score(
    match(title, $q) => 2,
    match(body, $q) => 1.5,
    text::semanticSimilarity(embeddings, $q) => 3
  ) desc
][0...10]{
  title,
  slug,
  _score
}