azure-search-documents-dotnet

Создавайте поисковые приложения с возможностями полнотекстового, векторного, семантического и гибридного поиска.

npx skills add https://github.com/microsoft/agent-skills --skill azure-search-documents-dotnet

Azure.Search.Documents (.NET)

Build search applications with full-text, vector, semantic, and hybrid search capabilities.

Installation

dotnet add package Azure.Search.Documents
dotnet add package Azure.Identity

Current Versions: Stable v11.7.0, Preview v11.8.0-beta.1

Environment Variables

SEARCH_ENDPOINT=https://<search-service>.search.windows.net  # Required: search service endpoint
SEARCH_INDEX_NAME=<index-name>  # Required: search index name
AZURE_TOKEN_CREDENTIALS=prod  # Required only if DefaultAzureCredential is used in production
SEARCH_API_KEY=<api-key>  # Only required for AzureKeyCredential auth

Authentication

Microsoft Entra Token Credential:

using Azure.Identity;
using Azure.Search.Documents;

// Local dev: DefaultAzureCredential. Production: set AZURE_TOKEN_CREDENTIALS=prod or AZURE_TOKEN_CREDENTIALS=<specific_credential>
var credential = new DefaultAzureCredential(
    DefaultAzureCredential.DefaultEnvironmentVariableName
);
// Or use a specific credential directly in production:
// See https://learn.microsoft.com/dotnet/api/overview/azure/identity-readme?view=azure-dotnet#credential-classes
// var credential = new ManagedIdentityCredential();
var client = new SearchClient(
    new Uri(Environment.GetEnvironmentVariable("SEARCH_ENDPOINT")),
    Environment.GetEnvironmentVariable("SEARCH_INDEX_NAME"),
    credential);

API Key:

using Azure;
using Azure.Search.Documents;

var credential = new AzureKeyCredential(
    Environment.GetEnvironmentVariable("SEARCH_API_KEY"));
var client = new SearchClient(
    new Uri(Environment.GetEnvironmentVariable("SEARCH_ENDPOINT")),
    Environment.GetEnvironmentVariable("SEARCH_INDEX_NAME"),
    credential);

Client Selection

ClientPurpose
SearchClientQuery indexes, upload/update/delete documents
SearchIndexClientCreate/manage indexes, synonym maps
SearchIndexerClientManage indexers, skillsets, data sources

Index Creation

Using FieldBuilder (Recommended)

using Azure.Search.Documents.Indexes;
using Azure.Search.Documents.Indexes.Models;

// Define model with attributes
public class Hotel
{
    [SimpleField(IsKey = true, IsFilterable = true)]
    public string HotelId { get; set; }

    [SearchableField(IsSortable = true)]
    public string HotelName { get; set; }

    [SearchableField(AnalyzerName = LexicalAnalyzerName.EnLucene)]
    public string Description { get; set; }

    [SimpleField(IsFilterable = true, IsSortable = true, IsFacetable = true)]
    public double? Rating { get; set; }

    [VectorSearchField(VectorSearchDimensions = 1536, VectorSearchProfileName = "vector-profile")]
    public ReadOnlyMemory<float>? DescriptionVector { get; set; }
}

// Create index
var indexClient = new SearchIndexClient(endpoint, credential);
var fieldBuilder = new FieldBuilder();
var fields = fieldBuilder.Build(typeof(Hotel));

var index = new SearchIndex("hotels")
{
    Fields = fields,
    VectorSearch = new VectorSearch
    {
        Profiles = { new VectorSearchProfile("vector-profile", "hnsw-algo") },
        Algorithms = { new HnswAlgorithmConfiguration("hnsw-algo") }
    }
};

await indexClient.CreateOrUpdateIndexAsync(index);

Manual Field Definition

var index = new SearchIndex("hotels")
{
    Fields =
    {
        new SimpleField("hotelId", SearchFieldDataType.String) { IsKey = true, IsFilterable = true },
        new SearchableField("hotelName") { IsSortable = true },
        new SearchableField("description") { AnalyzerName = LexicalAnalyzerName.EnLucene },
        new SimpleField("rating", SearchFieldDataType.Double) { IsFilterable = true, IsSortable = true },
        new SearchField("descriptionVector", SearchFieldDataType.Collection(SearchFieldDataType.Single))
        {
            VectorSearchDimensions = 1536,
            VectorSearchProfileName = "vector-profile"
        }
    }
};

Document Operations

var searchClient = new SearchClient(endpoint, indexName, credential);

// Upload (add new)
var hotels = new[] { new Hotel { HotelId = "1", HotelName = "Hotel A" } };
await searchClient.UploadDocumentsAsync(hotels);

// Merge (update existing)
await searchClient.MergeDocumentsAsync(hotels);

// Merge or Upload (upsert)
await searchClient.MergeOrUploadDocumentsAsync(hotels);

// Delete
await searchClient.DeleteDocumentsAsync("hotelId", new[] { "1", "2" });

// Batch operations
var batch = IndexDocumentsBatch.Create(
    IndexDocumentsAction.Upload(hotel1),
    IndexDocumentsAction.Merge(hotel2),
    IndexDocumentsAction.Delete(hotel3));
await searchClient.IndexDocumentsAsync(batch);

Search Patterns

Basic Search

var options = new SearchOptions
{
    Filter = "rating ge 4",
    OrderBy = { "rating desc" },
    Select = { "hotelId", "hotelName", "rating" },
    Size = 10,
    Skip = 0,
    IncludeTotalCount = true
};

SearchResults<Hotel> results = await searchClient.SearchAsync<Hotel>("luxury", options);

Console.WriteLine($"Total: {results.TotalCount}");
await foreach (SearchResult<Hotel> result in results.GetResultsAsync())
{
    Console.WriteLine($"{result.Document.HotelName} (Score: {result.Score})");
}

Faceted Search

var options = new SearchOptions
{
    Facets = { "rating,count:5", "category" }
};

var results = await searchClient.SearchAsync<Hotel>("*", options);

foreach (var facet in results.Value.Facets["rating"])
{
    Console.WriteLine($"Rating {facet.Value}: {facet.Count}");
}

Autocomplete and Suggestions

// Autocomplete
var autocompleteOptions = new AutocompleteOptions { Mode = AutocompleteMode.OneTermWithContext };
var autocomplete = await searchClient.AutocompleteAsync("lux", "suggester-name", autocompleteOptions);

// Suggestions
var suggestOptions = new SuggestOptions { UseFuzzyMatching = true };
var suggestions = await searchClient.SuggestAsync<Hotel>("lux", "suggester-name", suggestOptions);

Vector Search

See references/vector-search.md for detailed patterns.

using Azure.Search.Documents.Models;

// Pure vector search
var vectorQuery = new VectorizedQuery(embedding)
{
    KNearestNeighborsCount = 5,
    Fields = { "descriptionVector" }
};

var options = new SearchOptions
{
    VectorSearch = new VectorSearchOptions
    {
        Queries = { vectorQuery }
    }
};

var results = await searchClient.SearchAsync<Hotel>(null, options);

Semantic Search

See references/semantic-search.md for detailed patterns.

var options = new SearchOptions
{
    QueryType = SearchQueryType.Semantic,
    SemanticSearch = new SemanticSearchOptions
    {
        SemanticConfigurationName = "my-semantic-config",
        QueryCaption = new QueryCaption(QueryCaptionType.Extractive),
        QueryAnswer = new QueryAnswer(QueryAnswerType.Extractive)
    }
};

var results = await searchClient.SearchAsync<Hotel>("best hotel for families", options);

// Access semantic answers
foreach (var answer in results.Value.SemanticSearch.Answers)
{
    Console.WriteLine($"Answer: {answer.Text} (Score: {answer.Score})");
}

// Access captions
await foreach (var result in results.Value.GetResultsAsync())
{
    var caption = result.SemanticSearch?.Captions?.FirstOrDefault();
    Console.WriteLine($"Caption: {caption?.Text}");
}

Hybrid Search (Vector + Keyword + Semantic)

var vectorQuery = new VectorizedQuery(embedding)
{
    KNearestNeighborsCount = 5,
    Fields = { "descriptionVector" }
};

var options = new SearchOptions
{
    QueryType = SearchQueryType.Semantic,
    SemanticSearch = new SemanticSearchOptions
    {
        SemanticConfigurationName = "my-semantic-config"
    },
    VectorSearch = new VectorSearchOptions
    {
        Queries = { vectorQuery }
    }
};

// Combines keyword search, vector search, and semantic ranking
var results = await searchClient.SearchAsync<Hotel>("luxury beachfront", options);

Field Attributes Reference

AttributePurpose
SimpleFieldNon-searchable field (filters, sorting, facets)
SearchableFieldFull-text searchable field
VectorSearchFieldVector embedding field
IsKey = trueDocument key (required, one per index)
IsFilterable = trueEnable $filter expressions
IsSortable = trueEnable $orderby
IsFacetable = trueEnable faceted navigation
IsHidden = trueExclude from results
AnalyzerNameSpecify text analyzer

Error Handling

using Azure;

try
{
    var results = await searchClient.SearchAsync<Hotel>("query");
}
catch (RequestFailedException ex) when (ex.Status == 404)
{
    Console.WriteLine("Index not found");
}
catch (RequestFailedException ex)
{
    Console.WriteLine($"Search error: {ex.Status} - {ex.ErrorCode}: {ex.Message}");
}

Best Practices

  1. Use DefaultAzureCredential over API keys for production
  2. Use FieldBuilder with model attributes for type-safe index definitions
  3. Use CreateOrUpdateIndexAsync for idempotent index creation
  4. Batch document operations for better throughput
  5. Use Select to return only needed fields
  6. Configure semantic search for natural language queries
  7. Combine vector + keyword + semantic for best relevance

Reference Files

FileContents
references/vector-search.mdVector search, hybrid search, vectorizers
references/semantic-search.mdSemantic ranking, captions, answers

Больше skills от microsoft

oss-growth
microsoft
Персона OSS-хакера роста
official
microsoft-foundry
microsoft
Развёртывание, оценка и управление агентами Foundry «под ключ»: сборка Docker, отправка в ACR, создание хостируемых и промпт-агентов, запуск контейнера, пакетная оценка, непрерывная оценка, оптимизатор промптов, agent.yaml, курирование датасетов из трейсов. ИСПОЛЬЗУЙТЕ ДЛЯ: развёртывания агента в Foundry, хостируемого агента, создания агента, вызова агента, оценки агента, запуска пакетной оценки, непрерывной оценки, непрерывного мониторинга, статуса непрерывной оценки, оптимизации промпта, улучшения промпта, оптимизатора промптов, оптимизации инструкций агента, улучшения агента...
officialdevelopmentdevops
azure-ai
microsoft
Используется для Azure AI: поиск, речь, OpenAI, анализ документов. Помогает с поиском, векторным/гибридным поиском, преобразованием речи в текст, синтезом речи, транскрипцией, OCR. КОГДА: AI Search, поиск по запросу, векторный поиск, гибридный поиск, семантический поиск, преобразование речи в текст, синтез речи, транскрибирование, OCR, преобразование текста в речь.
officialdevelopmentapi
azure-deploy
microsoft
Выполнение развертываний Azure для УЖЕ ПОДГОТОВЛЕННЫХ приложений, имеющих существующие файлы .azure/deployment-plan.md и инфраструктуры. НЕ используйте этот навык, когда пользователь просит СОЗДАТЬ новое приложение — используйте azure-prepare. Этот навык выполняет команды azd up, azd deploy, terraform apply и az deployment со встроенным восстановлением после ошибок. Требует .azure/deployment-plan.md от azure-prepare и подтвержденный статус от azure-validate. КОГДА: "запустить azd up", "запустить azd deploy", "выполнить развертывание",...
officialdevopsaws
azure-storage
microsoft
Сервисы Azure Storage, включая Blob Storage, File Shares, Queue Storage, Table Storage и Data Lake. Отвечает на вопросы об уровнях доступа к хранилищу (горячий, холодный, холодный, архивный), когда использовать каждый уровень и сравнение уровней. Предоставляет объектное хранилище, SMB-файловые ресурсы, асинхронный обмен сообщениями, NoSQL-ключ-значение и аналитику больших данных. Включает управление жизненным циклом. ИСПОЛЬЗОВАТЬ ДЛЯ: хранилища BLOB-объектов, файловых ресурсов, хранилища очередей, табличного хранилища, Data Lake, загрузки файлов, скачивания BLOB-объектов, учетных записей хранения, уровней доступа,...
officialdevelopmentdatabase
azure-diagnostics
microsoft
Отладка проблем Azure в рабочей среде с помощью AppLens, Azure Monitor, работоспособности ресурсов и безопасной триаж. КОГДА: отладка проблем в рабочей среде, устранение неполадок службы приложений, высокая загрузка ЦП службы приложений, сбой развертывания службы приложений, устранение неполадок контейнерных приложений, устранение неполадок функций, устранение неполадок AKS, kubectl не может подключиться, сбои kube-system/CoreDNS, pod в состоянии ожидания, crashloop, узел не готов, сбои обновления, анализ журналов, KQL, аналитика, сбои извлечения образов, проблемы холодного запуска, сбои проверки работоспособности,...
officialdevopsdevelopment
azure-prepare
microsoft
Подготовка приложений Azure к развертыванию (инфра Bicep/Terraform, azure.yaml, Dockerfiles). Используйте для создания/модернизации или создания+развертывания; не для межоблачной миграции (используйте azure-cloud-migrate). НЕ ИСПОЛЬЗУЙТЕ ДЛЯ: приложений copilot-sdk (используйте azure-hosted-copilot-sdk). КОГДА: "создать приложение", "создать веб-приложение", "создать API", "создать бессерверный HTTP API", "создать фронтенд", "создать бэкенд", "собрать сервис", "модернизировать приложение", "обновить приложение", "добавить аутентификацию", "добавить кэширование", "разместить в Azure", "создать и...
officialdevelopmentdevops
azure-validate
microsoft
Предварительная проверка развертывания на готовность Azure. Выполняет глубокие проверки конфигурации, инфраструктуры (Bicep или Terraform), назначений ролей RBAC, разрешений управляемых удостоверений и предварительных требований перед развертыванием. КОГДА: проверить мое приложение, проверить готовность к развертыванию, выполнить предварительные проверки, проверить конфигурацию, проверить готовность к развертыванию, проверить azure.yaml, проверить Bicep, протестировать перед развертыванием, устранить ошибки развертывания, проверить Azure Functions, проверить приложение-функцию, проверить бессерверное...
officialdevopstesting