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.
Azure AI Search
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
Cosmos DB with Vector Search
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
| Factor | AI Search | Cosmos DB | PostgreSQL |
|---|---|---|---|
| Hybrid Search | Excellent | Limited | Manual |
| Scale | High | Very High | Medium |
| Cost | Higher | Medium | Lower |
| Global Distribution | Limited | Excellent | Manual |
| Learning Curve | Moderate | Low (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.