azure-search-documents-ts
Build search applications with vector, hybrid, and semantic search capabilities.
About this skill
This skill empowers AI agents to seamlessly integrate with Azure AI Search, providing robust document retrieval capabilities directly from indexed data. Leveraging the Azure AI Search SDK for TypeScript, agents can execute sophisticated search queries across various modalities: vector search for semantic understanding and similarity, hybrid search combining traditional keyword methods with vector matching, and semantic search for enhanced relevance and comprehension of user intent. It allows agents to access and process information from large datasets hosted on Azure, making it ideal for RAG (Retrieval Augmented Generation) workflows, intelligent chatbots, and complex data analysis tasks.
Best use case
Retrieving specific information from large enterprise knowledge bases; finding relevant documents for RAG applications; empowering intelligent chatbots to answer questions based on indexed data; performing complex data analysis by searching through structured and unstructured documents; building dynamic content recommendation systems based on search queries.
Build search applications with vector, hybrid, and semantic search capabilities.
The AI agent will successfully connect to an Azure AI Search instance, execute complex search queries (including vector, hybrid, and semantic), and return highly relevant documents or data snippets based on the query. This retrieved information can then be used for further processing, analysis, or generating detailed responses.
Practical example
Example input
User: "Find documents about 'sustainable energy solutions' published after 2023 that specifically mention 'solar panel efficiency improvements' and retrieve the top 3 most relevant results."
Agent Action: Call "azure-search-documents-ts" with parameters: { query: "sustainable energy solutions solar panel efficiency improvements", filters: "date ge '2023-01-01'", searchMode: "hybrid", top: 3 }Example output
Agent Response: {
"results": [
{
"id": "doc_101",
"title": "Advancements in Solar Panel Efficiency for Sustainable Grids (2024)",
"content": "This study explores the latest breakthroughs in solar panel technology, focusing on materials and design improvements that boost efficiency in sustainable energy solutions.",
"score": 0.98
},
{
"id": "doc_102",
"title": "Global Trends in Renewable Energy: A 2023-2024 Outlook",
"content": "Chapter 5 details the significant strides in solar energy, particularly discussing innovations in solar panel efficiency and their impact on global sustainable energy initiatives.",
"score": 0.92
},
{
"id": "doc_103",
"title": "Implementing Sustainable Energy: A Practical Guide (Post-2023)",
"content": "This guide covers various aspects of sustainable energy, with a section dedicated to selecting high-efficiency solar panels for optimal performance.",
"score": 0.87
}
]
}When to use this skill
- When an AI agent needs to access and search through data indexed in Azure AI Search. When high-relevance search is critical, including understanding user intent beyond simple keywords. When dealing with vector embeddings for semantic similarity search. When integrating with Azure's ecosystem for data storage and retrieval. When building applications that require a sophisticated and scalable search backend.
When not to use this skill
- When the required data is not stored in Azure AI Search or a compatible search index. When simple keyword search is sufficient, and the overhead of integrating a full AI Search service is unnecessary. When privacy policies or data residency requirements prevent the use of Azure AI Search. When a direct database query or simpler data retrieval method is more appropriate for the specific task.
Installation
Claude Code / Cursor / Codex
Manual Installation
- Download SKILL.md from GitHub
- Place it in
.claude/skills/azure-search-documents-ts/SKILL.mdinside your project - Restart your AI agent — it will auto-discover the skill
How azure-search-documents-ts Compares
| Feature / Agent | azure-search-documents-ts | Standard Approach |
|---|---|---|
| Platform Support | Claude | Limited / Varies |
| Context Awareness | High | Baseline |
| Installation Complexity | medium | N/A |
Frequently Asked Questions
What does this skill do?
Build search applications with vector, hybrid, and semantic search capabilities.
Which AI agents support this skill?
This skill is designed for Claude.
How difficult is it to install?
The installation complexity is rated as medium. You can find the installation instructions above.
Where can I find the source code?
You can find the source code on GitHub using the link provided at the top of the page.
Related Guides
Best AI Skills for Claude
Explore the best AI skills for Claude and Claude Code across coding, research, workflow automation, documentation, and agent operations.
Top AI Agents for Productivity
See the top AI agent skills for productivity, workflow automation, operational systems, documentation, and everyday task execution.
AI Agent for Product Research
Browse AI agent skills for product research, competitive analysis, customer discovery, and structured product decision support.
SKILL.md Source
# Azure AI Search SDK for TypeScript
Build search applications with vector, hybrid, and semantic search capabilities.
## Installation
```bash
npm install @azure/search-documents @azure/identity
```
## Environment Variables
```bash
AZURE_SEARCH_ENDPOINT=https://<service-name>.search.windows.net
AZURE_SEARCH_INDEX_NAME=my-index
AZURE_SEARCH_ADMIN_KEY=<admin-key> # Optional if using Entra ID
```
## Authentication
```typescript
import { SearchClient, SearchIndexClient } from "@azure/search-documents";
import { DefaultAzureCredential } from "@azure/identity";
const endpoint = process.env.AZURE_SEARCH_ENDPOINT!;
const indexName = process.env.AZURE_SEARCH_INDEX_NAME!;
const credential = new DefaultAzureCredential();
// For searching
const searchClient = new SearchClient(endpoint, indexName, credential);
// For index management
const indexClient = new SearchIndexClient(endpoint, credential);
```
## Core Workflow
### Create Index with Vector Field
```typescript
import { SearchIndex, SearchField, VectorSearch } from "@azure/search-documents";
const index: SearchIndex = {
name: "products",
fields: [
{ name: "id", type: "Edm.String", key: true },
{ name: "title", type: "Edm.String", searchable: true },
{ name: "description", type: "Edm.String", searchable: true },
{ name: "category", type: "Edm.String", filterable: true, facetable: true },
{
name: "embedding",
type: "Collection(Edm.Single)",
searchable: true,
vectorSearchDimensions: 1536,
vectorSearchProfileName: "vector-profile",
},
],
vectorSearch: {
algorithms: [
{ name: "hnsw-algorithm", kind: "hnsw" },
],
profiles: [
{ name: "vector-profile", algorithmConfigurationName: "hnsw-algorithm" },
],
},
};
await indexClient.createOrUpdateIndex(index);
```
### Index Documents
```typescript
const documents = [
{ id: "1", title: "Widget", description: "A useful widget", category: "Tools", embedding: [...] },
{ id: "2", title: "Gadget", description: "A cool gadget", category: "Electronics", embedding: [...] },
];
const result = await searchClient.uploadDocuments(documents);
console.log(`Indexed ${result.results.length} documents`);
```
### Full-Text Search
```typescript
const results = await searchClient.search("widget", {
select: ["id", "title", "description"],
filter: "category eq 'Tools'",
orderBy: ["title asc"],
top: 10,
});
for await (const result of results.results) {
console.log(`${result.document.title}: ${result.score}`);
}
```
### Vector Search
```typescript
const queryVector = await getEmbedding("useful tool"); // Your embedding function
const results = await searchClient.search("*", {
vectorSearchOptions: {
queries: [
{
kind: "vector",
vector: queryVector,
fields: ["embedding"],
kNearestNeighborsCount: 10,
},
],
},
select: ["id", "title", "description"],
});
for await (const result of results.results) {
console.log(`${result.document.title}: ${result.score}`);
}
```
### Hybrid Search (Text + Vector)
```typescript
const queryVector = await getEmbedding("useful tool");
const results = await searchClient.search("tool", {
vectorSearchOptions: {
queries: [
{
kind: "vector",
vector: queryVector,
fields: ["embedding"],
kNearestNeighborsCount: 50,
},
],
},
select: ["id", "title", "description"],
top: 10,
});
```
### Semantic Search
```typescript
// Index must have semantic configuration
const index: SearchIndex = {
name: "products",
fields: [...],
semanticSearch: {
configurations: [
{
name: "semantic-config",
prioritizedFields: {
titleField: { name: "title" },
contentFields: [{ name: "description" }],
},
},
],
},
};
// Search with semantic ranking
const results = await searchClient.search("best tool for the job", {
queryType: "semantic",
semanticSearchOptions: {
configurationName: "semantic-config",
captions: { captionType: "extractive" },
answers: { answerType: "extractive", count: 3 },
},
select: ["id", "title", "description"],
});
for await (const result of results.results) {
console.log(`${result.document.title}`);
console.log(` Caption: ${result.captions?.[0]?.text}`);
console.log(` Reranker Score: ${result.rerankerScore}`);
}
```
## Filtering and Facets
```typescript
// Filter syntax
const results = await searchClient.search("*", {
filter: "category eq 'Electronics' and price lt 100",
facets: ["category,count:10", "brand"],
});
// Access facets
for (const [facetName, facetResults] of Object.entries(results.facets || {})) {
console.log(`${facetName}:`);
for (const facet of facetResults) {
console.log(` ${facet.value}: ${facet.count}`);
}
}
```
## Autocomplete and Suggestions
```typescript
// Create suggester in index
const index: SearchIndex = {
name: "products",
fields: [...],
suggesters: [
{ name: "sg", sourceFields: ["title", "description"] },
],
};
// Autocomplete
const autocomplete = await searchClient.autocomplete("wid", "sg", {
mode: "twoTerms",
top: 5,
});
// Suggestions
const suggestions = await searchClient.suggest("wid", "sg", {
select: ["title"],
top: 5,
});
```
## Batch Operations
```typescript
// Batch upload, merge, delete
const batch = [
{ upload: { id: "1", title: "New Item" } },
{ merge: { id: "2", title: "Updated Title" } },
{ delete: { id: "3" } },
];
const result = await searchClient.indexDocuments({ actions: batch });
```
## Key Types
```typescript
import {
SearchClient,
SearchIndexClient,
SearchIndexerClient,
SearchIndex,
SearchField,
SearchOptions,
VectorSearch,
SemanticSearch,
SearchIterator,
} from "@azure/search-documents";
```
## Best Practices
1. **Use hybrid search** - Combine vector + text for best results
2. **Enable semantic ranking** - Improves relevance for natural language queries
3. **Batch document uploads** - Use `uploadDocuments` with arrays, not single docs
4. **Use filters for security** - Implement document-level security with filters
5. **Index incrementally** - Use `mergeOrUploadDocuments` for updates
6. **Monitor query performance** - Use `includeTotalCount: true` sparingly in production
## When to Use
This skill is applicable to execute the workflow or actions described in the overview.Related Skills
microsoft-azure-webjobs-extensions-authentication-events-dotnet
Microsoft Entra Authentication Events SDK for .NET. Azure Functions triggers for custom authentication extensions.
hybrid-search-implementation
Combine vector and keyword search for improved retrieval. Use when implementing RAG systems, building search engines, or when neither approach alone provides sufficient recall.
exa-search
Semantic search, similar content discovery, and structured research using Exa API. Use when you need semantic/embeddings-based search, finding similar content, or searching by category (company, people, research papers, etc.).
deep-research
Run autonomous research tasks that plan, search, read, and synthesize information into comprehensive reports.
context7-auto-research
Automatically fetch latest library/framework documentation for Claude Code via Context7 API. Use when you need up-to-date documentation for libraries and frameworks or asking about React, Next.js, Prisma, or any other popular library.
azure-web-pubsub-ts
Real-time messaging with WebSocket connections and pub/sub patterns.
azure-storage-queue-ts
Azure Queue Storage JavaScript/TypeScript SDK (@azure/storage-queue) for message queue operations. Use for sending, receiving, peeking, and deleting messages in queues.
azure-storage-queue-py
Azure Queue Storage SDK for Python. Use for reliable message queuing, task distribution, and asynchronous processing.
azure-storage-file-share-ts
Azure File Share JavaScript/TypeScript SDK (@azure/storage-file-share) for SMB file share operations.
azure-storage-file-share-py
Azure Storage File Share SDK for Python. Use for SMB file shares, directories, and file operations in the cloud.
azure-storage-file-datalake-py
Azure Data Lake Storage Gen2 SDK for Python. Use for hierarchical file systems, big data analytics, and file/directory operations.
azure-storage-blob-ts
Azure Blob Storage JavaScript/TypeScript SDK (@azure/storage-blob) for blob operations. Use for uploading, downloading, listing, and managing blobs and containers.