azure-search-documents-ts — скилл для Claude Code: поиск на Azure AI
Скилл для работы с Azure AI Search SDK на JavaScript: индексы, векторный и гибридный поиск, семантический ранкинг. Пригодится, когда агент пишет код поиска по Azure.
npx skills add microsoft/skills --skill azure-search-documents-ts -a claude-codeЧто делает azure-search-documents-ts
Скилл даёт агенту готовые шаблоны кода на TypeScript для @azure/search-documents. Внутри — создание индекса с векторным полем, загрузка документов, полнотекстовый, векторный и гибридный поиск, семантический ранкинг с captions и answers, фильтры и фасеты, автодополнение через suggester, батчевые операции upload/merge/delete.
Для работы нужны переменные окружения: AZURE_SEARCH_ENDPOINT, AZURE_SEARCH_INDEX_NAME и AZURE_SEARCH_ADMIN_KEY — последний необязателен, если используется Entra ID. Пакеты ставятся командой npm install @azure/search-documents @azure/identity. В продакшене с DefaultAzureCredential скилл требует выставить AZURE_TOKEN_CREDENTIALS=prod, иначе аутентификация не пройдёт так, как ожидается.
Семантический поиск заработает только на индексе с настроенным semanticSearch — конфигурация задаётся при создании индекса, добавить её к уже существующему не выйдет. Векторный поиск опирается на вашу функцию эмбеддингов: SDK её не предоставляет, вектор нужно получить до вызова search.
Какие задачи решает
- создать индекс с векторным полем и HNSW-профилем
- загрузить документы батчем через uploadDocuments
- собрать гибридный поиск из текста и вектора
- включить семантический ранкинг с captions и ответами
- настроить фасеты и фильтры по категории и цене
Примеры запросов агенту
- покажи, как создать индекс products с векторным полем embedding
- напиши гибридный поиск по индексу с kNearestNeighborsCount 50
- добавь семантический ранкинг с extractive captions в поиск
Как установить azure-search-documents-ts
1Через Skills CLI (Vercel)
npx skills add microsoft/skills --skill azure-search-documents-ts -a claude-code2Вручную: положить файлы
~/.claude/skills/azure-search-documents-ts/SKILL.mdПапка скилла целиком; для одного проекта — .claude/skills/azure-search-documents-ts/
Вручную: положить файлы
.agents/skills/azure-search-documents-ts/SKILL.mdДля всех проектов — ~/.agents/skills/
Вручную: положить файлы
.cursor/skills/azure-search-documents-ts/SKILL.mdCursor читает и .agents/skills/, и .claude/skills/
1GitHub CLI
gh skill install microsoft/skills azure-search-documents-ts2Вручную: положить файлы
.github/skills/azure-search-documents-ts/SKILL.mdКомандой платформы
gemini skills install https://github.com/microsoft/skills --path .github/plugins/azure-sdk-typescript/skills/azure-search-documents-tsВручную: положить файлы
.devin/skills/azure-search-documents-ts/SKILL.mdСтарый путь .windsurf/skills/ тоже читается
Claude.ai
Упакуйте папку в zip и загрузите в Settings → Capabilities → Skills
По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов
Из того же набора64
Весь набор →Похожие
Вопросы о azure-search-documents-ts
Как установить azure-search-documents-ts в Claude?
Выполните npx skills add microsoft/skills --skill azure-search-documents-ts -a claude-code. Скилл появится в ~/.claude/skills/azure-search-documents-ts/SKILL.md.
Что делает azure-search-documents-ts?
Подсказывает агенту, как писать код на TypeScript для Azure AI Search: индексы, векторный и гибридный поиск, семантический ранкинг, автодополнение, батчевые операции с документами.
Что нужно для работы скилла?
Пакеты @azure/search-documents и @azure/identity, а также переменные AZURE_SEARCH_ENDPOINT и AZURE_SEARCH_INDEX_NAME. Ключ AZURE_SEARCH_ADMIN_KEY нужен, если вы не используете Entra ID.
Исходный текст
SKILL.md · MIT
---
name: azure-search-documents-ts
description: Build search applications using Azure AI Search SDK for JavaScript (@azure/search-documents). Use when creating/managing indexes, implementing vector/hybrid search, semantic ranking, or building agentic retrieval with knowledge bases.
license: MIT
metadata:
author: Microsoft
version: "1.0.0"
package: '@azure/search-documents'
---
# 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
AZURE_TOKEN_CREDENTIALS=prod # Required only if DefaultAzureCredential is used in production
```
## Authentication
```typescript
import { SearchClient, SearchIndexClient } from "@azure/search-documents";
import { DefaultAzureCredential, ManagedIdentityCredential } from "@azure/identity";
const endpoint = process.env.AZURE_SEARCH_ENDPOINT!;
const indexName = process.env.AZURE_SEARCH_INDEX_NAME!;
// Local dev: DefaultAzureCredential. Production: set AZURE_TOKEN_CREDENTIALS=prod or AZURE_TOKEN_CREDENTIALS=<specific_credential>
const credential = new DefaultAzureCredential({requiredEnvVars: ["AZURE_TOKEN_CREDENTIALS"]});
// Or use a specific credential directly in production:
// See https://learn.microsoft.com/javascript/api/overview/azure/identity-readme?view=azure-node-latest#credential-classes
// const credential = new ManagedIdentityCredential();
// 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
© Microsoft · MIT · microsoft/skills