Back to Blog
3 min read

Vector Database Selection: Comparing Azure AI Search, Cosmos DB, and PostgreSQL

Choosing the right vector database significantly impacts RAG system performance and cost. Azure offers multiple options, each with distinct strengths for different use cases.

Understanding the Options

Azure AI Search, Cosmos DB with vector indexing, and Azure Database for PostgreSQL with pgvector each provide vector search capabilities with different trade-offs in scalability, features, and cost.

Best for: Full-featured search with hybrid capabilities and semantic ranking.

from azure.search.documents import SearchClient
from azure.search.documents.indexes import SearchIndexClient
from azure.search.documents.indexes.models import (
    SearchIndex, SearchField, VectorSearch,
    HnswAlgorithmConfiguration, VectorSearchProfile
)

# Create index with vector search
index = SearchIndex(
    name="documents",
    fields=[
        SearchField(name="id", type="Edm.String", key=True),
        SearchField(name="content", type="Edm.String", searchable=True),
        SearchField(
            name="embedding",
            type="Collection(Edm.Single)",
            searchable=True,
            vector_search_dimensions=1536,
            vector_search_profile_name="vector-profile"
        )
    ],
    vector_search=VectorSearch(
        algorithms=[
            HnswAlgorithmConfiguration(name="hnsw", parameters={"m": 4, "efConstruction": 400})
        ],
        profiles=[VectorSearchProfile(name="vector-profile", algorithm_configuration_name="hnsw")]
    )
)

# Hybrid search query
results = search_client.search(
    search_text="machine learning deployment",
    vector_queries=[VectorizedQuery(vector=query_embedding, k_nearest_neighbors=10, fields="embedding")],
    query_type="semantic",
    semantic_configuration_name="semantic-config",
    top=5
)

Pros: Hybrid search, semantic ranking, built-in AI enrichment Cons: Higher cost at scale, less flexibility for custom indexes

Best for: Global distribution and integration with existing Cosmos DB workloads.

from azure.cosmos import CosmosClient

# Create container with vector index policy
container_properties = {
    "id": "documents",
    "partitionKey": {"paths": ["/category"]},
    "vectorEmbeddingPolicy": {
        "vectorEmbeddings": [{
            "path": "/embedding",
            "dataType": "float32",
            "dimensions": 1536,
            "distanceFunction": "cosine"
        }]
    },
    "indexingPolicy": {
        "includedPaths": [{"path": "/*"}],
        "vectorIndexes": [{
            "path": "/embedding",
            "type": "quantizedFlat"  # or "flat", "diskANN"
        }]
    }
}

# Vector search query
query = """
SELECT TOP 10 c.id, c.content, VectorDistance(c.embedding, @queryVector) AS score
FROM c
ORDER BY VectorDistance(c.embedding, @queryVector)
"""

results = container.query_items(
    query=query,
    parameters=[{"name": "@queryVector", "value": query_embedding}],
    enable_cross_partition_query=True
)

Pros: Global distribution, multi-model support, familiar Cosmos DB experience Cons: Limited hybrid search, newer vector features

PostgreSQL with pgvector

Best for: Cost-effective deployments and SQL familiarity.

import psycopg2
from pgvector.psycopg2 import register_vector

conn = psycopg2.connect(connection_string)
register_vector(conn)

# Create table with vector column
cursor.execute("""
    CREATE TABLE documents (
        id SERIAL PRIMARY KEY,
        content TEXT,
        embedding vector(1536)
    );

    CREATE INDEX ON documents USING ivfflat (embedding vector_cosine_ops)
    WITH (lists = 100);
""")

# Vector search with metadata filtering
cursor.execute("""
    SELECT id, content, embedding <=> %s AS distance
    FROM documents
    WHERE category = %s
    ORDER BY embedding <=> %s
    LIMIT 10
""", (query_embedding, category, query_embedding))

Pros: Lower cost, SQL flexibility, open-source ecosystem Cons: Manual scaling, no built-in semantic features

Decision Framework

FactorAI SearchCosmos DBPostgreSQL
Hybrid SearchExcellentLimitedManual
ScaleHighVery HighMedium
CostHigherMediumLower
Global DistributionLimitedExcellentManual
Learning CurveModerateLow (if using Cosmos)Low

Choose Azure AI Search for feature-rich RAG systems, Cosmos DB for globally distributed applications, and PostgreSQL for cost-sensitive workloads with simpler requirements.

Michael John Peña

Michael John Peña

Senior Data Engineer based in Sydney. Writing about data, cloud, and technology.