Azure AI Search is the backbone of most RAG implementations in Azure. It provides full-text search, vector search, hybrid search, and semantic reranking β all in a managed service. This lesson covers index design, hybrid search configuration, and integrated vectorization.
π Reference: What is Azure AI Search?
# Create an Azure AI Search resource
az search service create \
--name my-search-service \
--resource-group my-rg \
--sku standard \
--location eastus2
In Azure AI Foundry portal:
from azure.search.documents.indexes import SearchIndexClient
from azure.identity import DefaultAzureCredential
# Connect to Azure AI Search
search_client = SearchIndexClient(
endpoint="https://my-search-service.search.windows.net",
credential=DefaultAzureCredential()
)
π Reference: Create a search service
A well-designed index is critical for RAG quality. Each index contains fields that define what data is stored and how itβs searched.
from azure.search.documents.indexes.models import (
SearchIndex,
SearchField,
SearchFieldDataType,
VectorSearch,
HnswAlgorithmConfiguration,
VectorSearchProfile,
SemanticConfiguration,
SemanticSearch,
SemanticPrioritizedFields,
SemanticField,
SearchableField,
SimpleField,
)
# Define index fields
fields = [
SimpleField(name="id", type=SearchFieldDataType.String, key=True,
filterable=True),
SearchableField(name="content", type=SearchFieldDataType.String,
analyzer_name="en.microsoft"),
SearchableField(name="title", type=SearchFieldDataType.String),
SimpleField(name="source_file", type=SearchFieldDataType.String,
filterable=True, facetable=True),
SimpleField(name="page_number", type=SearchFieldDataType.Int32,
filterable=True),
SimpleField(name="category", type=SearchFieldDataType.String,
filterable=True, facetable=True),
SearchField(
name="content_vector",
type=SearchFieldDataType.Collection(SearchFieldDataType.Single),
searchable=True,
vector_search_dimensions=1536,
vector_search_profile_name="my-vector-profile"
),
]
# Configure vector search with HNSW algorithm
vector_search = VectorSearch(
algorithms=[
HnswAlgorithmConfiguration(name="my-hnsw", parameters={
"m": 4,
"efConstruction": 400,
"efSearch": 500,
"metric": "cosine"
})
],
profiles=[
VectorSearchProfile(
name="my-vector-profile",
algorithm_configuration_name="my-hnsw"
)
]
)
# Configure semantic reranking
semantic_config = SemanticConfiguration(
name="my-semantic-config",
prioritized_fields=SemanticPrioritizedFields(
content_fields=[SemanticField(field_name="content")],
title_field=SemanticField(field_name="title")
)
)
semantic_search = SemanticSearch(configurations=[semantic_config])
index = SearchIndex(
name="rag-index",
fields=fields,
vector_search=vector_search,
semantic_search=semantic_search
)
result = search_client.create_or_update_index(index)
print(f"Index '{result.name}' created successfully")
π Reference: Create a search index
Hybrid search combines multiple retrieval methods for the best results. This is the recommended approach for production RAG.
User Query
β
ββββΆ Keyword Search (BM25) βββ
β ββββΆ Reciprocal Rank Fusion βββΆ Semantic Reranking βββΆ Results
ββββΆ Vector Search (cosine) βββ
from azure.search.documents import SearchClient
from azure.search.documents.models import VectorizableTextQuery
search_client = SearchClient(
endpoint="https://my-search-service.search.windows.net",
index_name="rag-index",
credential=DefaultAzureCredential()
)
# Hybrid search: keyword + vector + semantic reranking
results = search_client.search(
search_text="How do I configure networking for my AI model?",
vector_queries=[
VectorizableTextQuery(
text="How do I configure networking for my AI model?",
k_nearest_neighbors=5,
fields="content_vector"
)
],
query_type="semantic",
semantic_configuration_name="my-semantic-config",
top=5,
select=["id", "title", "content", "source_file"]
)
for result in results:
print(f"Score: {result['@search.score']:.4f} | {result['title']}")
print(f" Reranker: {result['@search.reranker_score']:.4f}")
print(f" Source: {result['source_file']}")
print()
π‘ Tip: Always enable semantic reranking for production RAG. It significantly improves relevance by using a deep learning model to reorder results based on semantic understanding, not just keyword or vector similarity.
π Reference: Hybrid search in Azure AI Search
Integrated vectorization automates the chunking and embedding steps β Azure AI Search calls an embedding model during both indexing and querying.
from azure.search.documents.indexes.models import (
AzureOpenAIVectorizer,
AzureOpenAIVectorizerParameters,
)
# Configure integrated vectorization
vectorizer = AzureOpenAIVectorizer(
vectorizer_name="my-vectorizer",
parameters=AzureOpenAIVectorizerParameters(
resource_url="https://my-openai.openai.azure.com",
deployment_name="text-embedding-3-small",
model_name="text-embedding-3-small"
)
)
Benefits of integrated vectorization:
π Reference: Integrated vectorization
Skillsets run AI transformations during indexing β OCR, entity extraction, translation, and more.
from azure.search.documents.indexes.models import (
SearchIndexerSkillset,
OcrSkill,
MergeSkill,
InputFieldMappingEntry,
OutputFieldMappingEntry,
)
# OCR skill to extract text from images in documents
ocr_skill = OcrSkill(
name="ocr-skill",
description="Extract text from images",
context="/document/normalized_images/*",
inputs=[InputFieldMappingEntry(name="image", source="/document/normalized_images/*")],
outputs=[OutputFieldMappingEntry(name="text", target_name="text")]
)
π Reference: Skillset concepts
Projections let you shape indexed data into different structures β useful for creating chunk-level indexes from document-level data.
| Projection Type | Use Case |
|---|---|
| Table projections | Structured data for analytics |
| Object projections | JSON documents in blob storage |
| File projections | Binary files (images, PDFs) |
π Reference: Search index projections
| β Lesson 1 | Next: Lesson 3 β Advanced RAG Patterns β |