[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M69AP14BQEZV3F810KMN76P1":3,"skill-same:01M69AP14BQEZV3F810KMN76P1":84},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":41,"linkOnly":42,"markdownContent":43,"markdownBody":44,"frontMatter":45,"refName":50,"commitSha":51,"skillDirectory":52,"forksCount":53,"repositoryHtmlUrl":54,"repositoryHomepageUrl":55,"ownerHtmlUrl":56,"ownerBlogUrl":57,"ownerDescription":58,"updatedAt":59,"install":60,"resources":73},"01M69AP14BQEZV3F810KMN76P1","azure-search-documents-dotnet",null,"Azure AI Search SDK for .NET (Azure.Search.Documents). Use for building search applications with full-text, vector, semantic, and hybrid search. Covers SearchClient (queries, document CRUD), SearchIndexClient (index management), and SearchIndexerClient (indexers, skillsets). Triggers: \"Azure Search .NET\", \"SearchClient\", \"SearchIndexClient\", \"vector search C#\", \"semantic search .NET\", \"hybrid search\", \"Azure.Search.Documents\".","microsoft\u002Fskills","microsoft","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F6154722?v=4","01M698VYDXZ6JW5WH3CRV650R8","Microsoft","01M69AJYYW4E1RMSYCQDJ4FJSH",3199,"MIT","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fskills\u002Fblob\u002Fmain\u002F.github\u002Fplugins\u002Fazure-sdk-dotnet\u002Fskills\u002Fazure-search-documents-dotnet\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,9],"dotnet","documents","azure","azure search documents dotnet","search","search documents","index management","sdk","hybrid","for","with","Hybrid Search","triggers","full","document","use","text","crud","applications","vector","semantic search","azure ai","2026-11-10 10:12:30",false,"---\nname: azure-search-documents-dotnet\ndescription: |\n  Azure AI Search SDK for .NET (Azure.Search.Documents). Use for building search applications with full-text, vector, semantic, and hybrid search. Covers SearchClient (queries, document CRUD), SearchIndexClient (index management), and SearchIndexerClient (indexers, skillsets). Triggers: \"Azure Search .NET\", \"SearchClient\", \"SearchIndexClient\", \"vector search C#\", \"semantic search .NET\", \"hybrid search\", \"Azure.Search.Documents\".\nlicense: MIT\nmetadata:\n  author: Microsoft\n  version: \"1.0.0\"\n  package: Azure.Search.Documents\n---\n\n# Azure.Search.Documents (.NET)\n\nBuild search applications with full-text, vector, semantic, and hybrid search capabilities.\n\n## Installation\n\n```bash\ndotnet add package Azure.Search.Documents\ndotnet add package Azure.Identity\n```\n\n**Current Versions**: Stable v11.7.0, Preview v11.8.0-beta.1\n\n## Environment Variables\n\n```bash\nSEARCH_ENDPOINT=https:\u002F\u002F\u003Csearch-service>.search.windows.net  # Required: search service endpoint\nSEARCH_INDEX_NAME=\u003Cindex-name>  # Required: search index name\nAZURE_TOKEN_CREDENTIALS=prod  # Required only if DefaultAzureCredential is used in production\nSEARCH_API_KEY=\u003Capi-key>  # Only required for AzureKeyCredential auth\n```\n\n## Authentication\n\n**Microsoft Entra Token Credential**:\n```csharp\nusing Azure.Identity;\nusing Azure.Search.Documents;\n\n\u002F\u002F Local dev: DefaultAzureCredential. Production: set AZURE_TOKEN_CREDENTIALS=prod or AZURE_TOKEN_CREDENTIALS=\u003Cspecific_credential>\nvar credential = new DefaultAzureCredential(\n    DefaultAzureCredential.DefaultEnvironmentVariableName\n);\n\u002F\u002F Or use a specific credential directly in production:\n\u002F\u002F See https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fapi\u002Foverview\u002Fazure\u002Fidentity-readme?view=azure-dotnet#credential-classes\n\u002F\u002F var credential = new ManagedIdentityCredential();\nvar client = new SearchClient(\n    new Uri(Environment.GetEnvironmentVariable(\"SEARCH_ENDPOINT\")),\n    Environment.GetEnvironmentVariable(\"SEARCH_INDEX_NAME\"),\n    credential);\n```\n\n**API Key**:\n```csharp\nusing Azure;\nusing Azure.Search.Documents;\n\nvar credential = new AzureKeyCredential(\n    Environment.GetEnvironmentVariable(\"SEARCH_API_KEY\"));\nvar client = new SearchClient(\n    new Uri(Environment.GetEnvironmentVariable(\"SEARCH_ENDPOINT\")),\n    Environment.GetEnvironmentVariable(\"SEARCH_INDEX_NAME\"),\n    credential);\n```\n\n## Client Selection\n\n| Client | Purpose |\n|--------|---------|\n| `SearchClient` | Query indexes, upload\u002Fupdate\u002Fdelete documents |\n| `SearchIndexClient` | Create\u002Fmanage indexes, synonym maps |\n| `SearchIndexerClient` | Manage indexers, skillsets, data sources |\n\n## Index Creation\n\n### Using FieldBuilder (Recommended)\n\n```csharp\nusing Azure.Search.Documents.Indexes;\nusing Azure.Search.Documents.Indexes.Models;\n\n\u002F\u002F Define model with attributes\npublic class Hotel\n{\n    [SimpleField(IsKey = true, IsFilterable = true)]\n    public string HotelId { get; set; }\n\n    [SearchableField(IsSortable = true)]\n    public string HotelName { get; set; }\n\n    [SearchableField(AnalyzerName = LexicalAnalyzerName.EnLucene)]\n    public string Description { get; set; }\n\n    [SimpleField(IsFilterable = true, IsSortable = true, IsFacetable = true)]\n    public double? Rating { get; set; }\n\n    [VectorSearchField(VectorSearchDimensions = 1536, VectorSearchProfileName = \"vector-profile\")]\n    public ReadOnlyMemory\u003Cfloat>? DescriptionVector { get; set; }\n}\n\n\u002F\u002F Create index\nvar indexClient = new SearchIndexClient(endpoint, credential);\nvar fieldBuilder = new FieldBuilder();\nvar fields = fieldBuilder.Build(typeof(Hotel));\n\nvar index = new SearchIndex(\"hotels\")\n{\n    Fields = fields,\n    VectorSearch = new VectorSearch\n    {\n        Profiles = { new VectorSearchProfile(\"vector-profile\", \"hnsw-algo\") },\n        Algorithms = { new HnswAlgorithmConfiguration(\"hnsw-algo\") }\n    }\n};\n\nawait indexClient.CreateOrUpdateIndexAsync(index);\n```\n\n### Manual Field Definition\n\n```csharp\nvar index = new SearchIndex(\"hotels\")\n{\n    Fields =\n    {\n        new SimpleField(\"hotelId\", SearchFieldDataType.String) { IsKey = true, IsFilterable = true },\n        new SearchableField(\"hotelName\") { IsSortable = true },\n        new SearchableField(\"description\") { AnalyzerName = LexicalAnalyzerName.EnLucene },\n        new SimpleField(\"rating\", SearchFieldDataType.Double) { IsFilterable = true, IsSortable = true },\n        new SearchField(\"descriptionVector\", SearchFieldDataType.Collection(SearchFieldDataType.Single))\n        {\n            VectorSearchDimensions = 1536,\n            VectorSearchProfileName = \"vector-profile\"\n        }\n    }\n};\n```\n\n## Document Operations\n\n```csharp\nvar searchClient = new SearchClient(endpoint, indexName, credential);\n\n\u002F\u002F Upload (add new)\nvar hotels = new[] { new Hotel { HotelId = \"1\", HotelName = \"Hotel A\" } };\nawait searchClient.UploadDocumentsAsync(hotels);\n\n\u002F\u002F Merge (update existing)\nawait searchClient.MergeDocumentsAsync(hotels);\n\n\u002F\u002F Merge or Upload (upsert)\nawait searchClient.MergeOrUploadDocumentsAsync(hotels);\n\n\u002F\u002F Delete\nawait searchClient.DeleteDocumentsAsync(\"hotelId\", new[] { \"1\", \"2\" });\n\n\u002F\u002F Batch operations\nvar batch = IndexDocumentsBatch.Create(\n    IndexDocumentsAction.Upload(hotel1),\n    IndexDocumentsAction.Merge(hotel2),\n    IndexDocumentsAction.Delete(hotel3));\nawait searchClient.IndexDocumentsAsync(batch);\n```\n\n## Search Patterns\n\n### Basic Search\n\n```csharp\nvar options = new SearchOptions\n{\n    Filter = \"rating ge 4\",\n    OrderBy = { \"rating desc\" },\n    Select = { \"hotelId\", \"hotelName\", \"rating\" },\n    Size = 10,\n    Skip = 0,\n    IncludeTotalCount = true\n};\n\nSearchResults\u003CHotel> results = await searchClient.SearchAsync\u003CHotel>(\"luxury\", options);\n\nConsole.WriteLine($\"Total: {results.TotalCount}\");\nawait foreach (SearchResult\u003CHotel> result in results.GetResultsAsync())\n{\n    Console.WriteLine($\"{result.Document.HotelName} (Score: {result.Score})\");\n}\n```\n\n### Faceted Search\n\n```csharp\nvar options = new SearchOptions\n{\n    Facets = { \"rating,count:5\", \"category\" }\n};\n\nvar results = await searchClient.SearchAsync\u003CHotel>(\"*\", options);\n\nforeach (var facet in results.Value.Facets[\"rating\"])\n{\n    Console.WriteLine($\"Rating {facet.Value}: {facet.Count}\");\n}\n```\n\n### Autocomplete and Suggestions\n\n```csharp\n\u002F\u002F Autocomplete\nvar autocompleteOptions = new AutocompleteOptions { Mode = AutocompleteMode.OneTermWithContext };\nvar autocomplete = await searchClient.AutocompleteAsync(\"lux\", \"suggester-name\", autocompleteOptions);\n\n\u002F\u002F Suggestions\nvar suggestOptions = new SuggestOptions { UseFuzzyMatching = true };\nvar suggestions = await searchClient.SuggestAsync\u003CHotel>(\"lux\", \"suggester-name\", suggestOptions);\n```\n\n## Vector Search\n\nSee [references\u002Fvector-search.md](references\u002Fvector-search.md) for detailed patterns.\n\n```csharp\nusing Azure.Search.Documents.Models;\n\n\u002F\u002F Pure vector search\nvar vectorQuery = new VectorizedQuery(embedding)\n{\n    KNearestNeighborsCount = 5,\n    Fields = { \"descriptionVector\" }\n};\n\nvar options = new SearchOptions\n{\n    VectorSearch = new VectorSearchOptions\n    {\n        Queries = { vectorQuery }\n    }\n};\n\nvar results = await searchClient.SearchAsync\u003CHotel>(null, options);\n```\n\n## Semantic Search\n\nSee [references\u002Fsemantic-search.md](references\u002Fsemantic-search.md) for detailed patterns.\n\n```csharp\nvar options = new SearchOptions\n{\n    QueryType = SearchQueryType.Semantic,\n    SemanticSearch = new SemanticSearchOptions\n    {\n        SemanticConfigurationName = \"my-semantic-config\",\n        QueryCaption = new QueryCaption(QueryCaptionType.Extractive),\n        QueryAnswer = new QueryAnswer(QueryAnswerType.Extractive)\n    }\n};\n\nvar results = await searchClient.SearchAsync\u003CHotel>(\"best hotel for families\", options);\n\n\u002F\u002F Access semantic answers\nforeach (var answer in results.Value.SemanticSearch.Answers)\n{\n    Console.WriteLine($\"Answer: {answer.Text} (Score: {answer.Score})\");\n}\n\n\u002F\u002F Access captions\nawait foreach (var result in results.Value.GetResultsAsync())\n{\n    var caption = result.SemanticSearch?.Captions?.FirstOrDefault();\n    Console.WriteLine($\"Caption: {caption?.Text}\");\n}\n```\n\n## Hybrid Search (Vector + Keyword + Semantic)\n\n```csharp\nvar vectorQuery = new VectorizedQuery(embedding)\n{\n    KNearestNeighborsCount = 5,\n    Fields = { \"descriptionVector\" }\n};\n\nvar options = new SearchOptions\n{\n    QueryType = SearchQueryType.Semantic,\n    SemanticSearch = new SemanticSearchOptions\n    {\n        SemanticConfigurationName = \"my-semantic-config\"\n    },\n    VectorSearch = new VectorSearchOptions\n    {\n        Queries = { vectorQuery }\n    }\n};\n\n\u002F\u002F Combines keyword search, vector search, and semantic ranking\nvar results = await searchClient.SearchAsync\u003CHotel>(\"luxury beachfront\", options);\n```\n\n## Field Attributes Reference\n\n| Attribute | Purpose |\n|-----------|---------|\n| `SimpleField` | Non-searchable field (filters, sorting, facets) |\n| `SearchableField` | Full-text searchable field |\n| `VectorSearchField` | Vector embedding field |\n| `IsKey = true` | Document key (required, one per index) |\n| `IsFilterable = true` | Enable $filter expressions |\n| `IsSortable = true` | Enable $orderby |\n| `IsFacetable = true` | Enable faceted navigation |\n| `IsHidden = true` | Exclude from results |\n| `AnalyzerName` | Specify text analyzer |\n\n## Error Handling\n\n```csharp\nusing Azure;\n\ntry\n{\n    var results = await searchClient.SearchAsync\u003CHotel>(\"query\");\n}\ncatch (RequestFailedException ex) when (ex.Status == 404)\n{\n    Console.WriteLine(\"Index not found\");\n}\ncatch (RequestFailedException ex)\n{\n    Console.WriteLine($\"Search error: {ex.Status} - {ex.ErrorCode}: {ex.Message}\");\n}\n```\n\n## Best Practices\n\n1. **Use `DefaultAzureCredential`** over API keys for production\n2. **Use `FieldBuilder`** with model attributes for type-safe index definitions\n3. **Use `CreateOrUpdateIndexAsync`** for idempotent index creation\n4. **Batch document operations** for better throughput\n5. **Use `Select`** to return only needed fields\n6. **Configure semantic search** for natural language queries\n7. **Combine vector + keyword + semantic** for best relevance\n\n## Reference Files\n\n| File | Contents |\n|------|----------|\n| [references\u002Fvector-search.md](references\u002Fvector-search.md) | Vector search, hybrid search, vectorizers |\n| [references\u002Fsemantic-search.md](references\u002Fsemantic-search.md) | Semantic ranking, captions, answers |\n","# Azure.Search.Documents (.NET)\n\nBuild search applications with full-text, vector, semantic, and hybrid search capabilities.\n\n## Installation\n\n```bash\ndotnet add package Azure.Search.Documents\ndotnet add package Azure.Identity\n```\n\n**Current Versions**: Stable v11.7.0, Preview v11.8.0-beta.1\n\n## Environment Variables\n\n```bash\nSEARCH_ENDPOINT=https:\u002F\u002F\u003Csearch-service>.search.windows.net  # Required: search service endpoint\nSEARCH_INDEX_NAME=\u003Cindex-name>  # Required: search index name\nAZURE_TOKEN_CREDENTIALS=prod  # Required only if DefaultAzureCredential is used in production\nSEARCH_API_KEY=\u003Capi-key>  # Only required for AzureKeyCredential auth\n```\n\n## Authentication\n\n**Microsoft Entra Token Credential**:\n```csharp\nusing Azure.Identity;\nusing Azure.Search.Documents;\n\n\u002F\u002F Local dev: DefaultAzureCredential. Production: set AZURE_TOKEN_CREDENTIALS=prod or AZURE_TOKEN_CREDENTIALS=\u003Cspecific_credential>\nvar credential = new DefaultAzureCredential(\n    DefaultAzureCredential.DefaultEnvironmentVariableName\n);\n\u002F\u002F Or use a specific credential directly in production:\n\u002F\u002F See https:\u002F\u002Flearn.microsoft.com\u002Fdotnet\u002Fapi\u002Foverview\u002Fazure\u002Fidentity-readme?view=azure-dotnet#credential-classes\n\u002F\u002F var credential = new ManagedIdentityCredential();\nvar client = new SearchClient(\n    new Uri(Environment.GetEnvironmentVariable(\"SEARCH_ENDPOINT\")),\n    Environment.GetEnvironmentVariable(\"SEARCH_INDEX_NAME\"),\n    credential);\n```\n\n**API Key**:\n```csharp\nusing Azure;\nusing Azure.Search.Documents;\n\nvar credential = new AzureKeyCredential(\n    Environment.GetEnvironmentVariable(\"SEARCH_API_KEY\"));\nvar client = new SearchClient(\n    new Uri(Environment.GetEnvironmentVariable(\"SEARCH_ENDPOINT\")),\n    Environment.GetEnvironmentVariable(\"SEARCH_INDEX_NAME\"),\n    credential);\n```\n\n## Client Selection\n\n| Client | Purpose |\n|--------|---------|\n| `SearchClient` | Query indexes, upload\u002Fupdate\u002Fdelete documents |\n| `SearchIndexClient` | Create\u002Fmanage indexes, synonym maps |\n| `SearchIndexerClient` | Manage indexers, skillsets, data sources |\n\n## Index Creation\n\n### Using FieldBuilder (Recommended)\n\n```csharp\nusing Azure.Search.Documents.Indexes;\nusing Azure.Search.Documents.Indexes.Models;\n\n\u002F\u002F Define model with attributes\npublic class Hotel\n{\n    [SimpleField(IsKey = true, IsFilterable = true)]\n    public string HotelId { get; set; }\n\n    [SearchableField(IsSortable = true)]\n    public string HotelName { get; set; }\n\n    [SearchableField(AnalyzerName = LexicalAnalyzerName.EnLucene)]\n    public string Description { get; set; }\n\n    [SimpleField(IsFilterable = true, IsSortable = true, IsFacetable = true)]\n    public double? Rating { get; set; }\n\n    [VectorSearchField(VectorSearchDimensions = 1536, VectorSearchProfileName = \"vector-profile\")]\n    public ReadOnlyMemory\u003Cfloat>? DescriptionVector { get; set; }\n}\n\n\u002F\u002F Create index\nvar indexClient = new SearchIndexClient(endpoint, credential);\nvar fieldBuilder = new FieldBuilder();\nvar fields = fieldBuilder.Build(typeof(Hotel));\n\nvar index = new SearchIndex(\"hotels\")\n{\n    Fields = fields,\n    VectorSearch = new VectorSearch\n    {\n        Profiles = { new VectorSearchProfile(\"vector-profile\", \"hnsw-algo\") },\n        Algorithms = { new HnswAlgorithmConfiguration(\"hnsw-algo\") }\n    }\n};\n\nawait indexClient.CreateOrUpdateIndexAsync(index);\n```\n\n### Manual Field Definition\n\n```csharp\nvar index = new SearchIndex(\"hotels\")\n{\n    Fields =\n    {\n        new SimpleField(\"hotelId\", SearchFieldDataType.String) { IsKey = true, IsFilterable = true },\n        new SearchableField(\"hotelName\") { IsSortable = true },\n        new SearchableField(\"description\") { AnalyzerName = LexicalAnalyzerName.EnLucene },\n        new SimpleField(\"rating\", SearchFieldDataType.Double) { IsFilterable = true, IsSortable = true },\n        new SearchField(\"descriptionVector\", SearchFieldDataType.Collection(SearchFieldDataType.Single))\n        {\n            VectorSearchDimensions = 1536,\n            VectorSearchProfileName = \"vector-profile\"\n        }\n    }\n};\n```\n\n## Document Operations\n\n```csharp\nvar searchClient = new SearchClient(endpoint, indexName, credential);\n\n\u002F\u002F Upload (add new)\nvar hotels = new[] { new Hotel { HotelId = \"1\", HotelName = \"Hotel A\" } };\nawait searchClient.UploadDocumentsAsync(hotels);\n\n\u002F\u002F Merge (update existing)\nawait searchClient.MergeDocumentsAsync(hotels);\n\n\u002F\u002F Merge or Upload (upsert)\nawait searchClient.MergeOrUploadDocumentsAsync(hotels);\n\n\u002F\u002F Delete\nawait searchClient.DeleteDocumentsAsync(\"hotelId\", new[] { \"1\", \"2\" });\n\n\u002F\u002F Batch operations\nvar batch = IndexDocumentsBatch.Create(\n    IndexDocumentsAction.Upload(hotel1),\n    IndexDocumentsAction.Merge(hotel2),\n    IndexDocumentsAction.Delete(hotel3));\nawait searchClient.IndexDocumentsAsync(batch);\n```\n\n## Search Patterns\n\n### Basic Search\n\n```csharp\nvar options = new SearchOptions\n{\n    Filter = \"rating ge 4\",\n    OrderBy = { \"rating desc\" },\n    Select = { \"hotelId\", \"hotelName\", \"rating\" },\n    Size = 10,\n    Skip = 0,\n    IncludeTotalCount = true\n};\n\nSearchResults\u003CHotel> results = await searchClient.SearchAsync\u003CHotel>(\"luxury\", options);\n\nConsole.WriteLine($\"Total: {results.TotalCount}\");\nawait foreach (SearchResult\u003CHotel> result in results.GetResultsAsync())\n{\n    Console.WriteLine($\"{result.Document.HotelName} (Score: {result.Score})\");\n}\n```\n\n### Faceted Search\n\n```csharp\nvar options = new SearchOptions\n{\n    Facets = { \"rating,count:5\", \"category\" }\n};\n\nvar results = await searchClient.SearchAsync\u003CHotel>(\"*\", options);\n\nforeach (var facet in results.Value.Facets[\"rating\"])\n{\n    Console.WriteLine($\"Rating {facet.Value}: {facet.Count}\");\n}\n```\n\n### Autocomplete and Suggestions\n\n```csharp\n\u002F\u002F Autocomplete\nvar autocompleteOptions = new AutocompleteOptions { Mode = AutocompleteMode.OneTermWithContext };\nvar autocomplete = await searchClient.AutocompleteAsync(\"lux\", \"suggester-name\", autocompleteOptions);\n\n\u002F\u002F Suggestions\nvar suggestOptions = new SuggestOptions { UseFuzzyMatching = true };\nvar suggestions = await searchClient.SuggestAsync\u003CHotel>(\"lux\", \"suggester-name\", suggestOptions);\n```\n\n## Vector Search\n\nSee [references\u002Fvector-search.md](references\u002Fvector-search.md) for detailed patterns.\n\n```csharp\nusing Azure.Search.Documents.Models;\n\n\u002F\u002F Pure vector search\nvar vectorQuery = new VectorizedQuery(embedding)\n{\n    KNearestNeighborsCount = 5,\n    Fields = { \"descriptionVector\" }\n};\n\nvar options = new SearchOptions\n{\n    VectorSearch = new VectorSearchOptions\n    {\n        Queries = { vectorQuery }\n    }\n};\n\nvar results = await searchClient.SearchAsync\u003CHotel>(null, options);\n```\n\n## Semantic Search\n\nSee [references\u002Fsemantic-search.md](references\u002Fsemantic-search.md) for detailed patterns.\n\n```csharp\nvar options = new SearchOptions\n{\n    QueryType = SearchQueryType.Semantic,\n    SemanticSearch = new SemanticSearchOptions\n    {\n        SemanticConfigurationName = \"my-semantic-config\",\n        QueryCaption = new QueryCaption(QueryCaptionType.Extractive),\n        QueryAnswer = new QueryAnswer(QueryAnswerType.Extractive)\n    }\n};\n\nvar results = await searchClient.SearchAsync\u003CHotel>(\"best hotel for families\", options);\n\n\u002F\u002F Access semantic answers\nforeach (var answer in results.Value.SemanticSearch.Answers)\n{\n    Console.WriteLine($\"Answer: {answer.Text} (Score: {answer.Score})\");\n}\n\n\u002F\u002F Access captions\nawait foreach (var result in results.Value.GetResultsAsync())\n{\n    var caption = result.SemanticSearch?.Captions?.FirstOrDefault();\n    Console.WriteLine($\"Caption: {caption?.Text}\");\n}\n```\n\n## Hybrid Search (Vector + Keyword + Semantic)\n\n```csharp\nvar vectorQuery = new VectorizedQuery(embedding)\n{\n    KNearestNeighborsCount = 5,\n    Fields = { \"descriptionVector\" }\n};\n\nvar options = new SearchOptions\n{\n    QueryType = SearchQueryType.Semantic,\n    SemanticSearch = new SemanticSearchOptions\n    {\n        SemanticConfigurationName = \"my-semantic-config\"\n    },\n    VectorSearch = new VectorSearchOptions\n    {\n        Queries = { vectorQuery }\n    }\n};\n\n\u002F\u002F Combines keyword search, vector search, and semantic ranking\nvar results = await searchClient.SearchAsync\u003CHotel>(\"luxury beachfront\", options);\n```\n\n## Field Attributes Reference\n\n| Attribute | Purpose |\n|-----------|---------|\n| `SimpleField` | Non-searchable field (filters, sorting, facets) |\n| `SearchableField` | Full-text searchable field |\n| `VectorSearchField` | Vector embedding field |\n| `IsKey = true` | Document key (required, one per index) |\n| `IsFilterable = true` | Enable $filter expressions |\n| `IsSortable = true` | Enable $orderby |\n| `IsFacetable = true` | Enable faceted navigation |\n| `IsHidden = true` | Exclude from results |\n| `AnalyzerName` | Specify text analyzer |\n\n## Error Handling\n\n```csharp\nusing Azure;\n\ntry\n{\n    var results = await searchClient.SearchAsync\u003CHotel>(\"query\");\n}\ncatch (RequestFailedException ex) when (ex.Status == 404)\n{\n    Console.WriteLine(\"Index not found\");\n}\ncatch (RequestFailedException ex)\n{\n    Console.WriteLine($\"Search error: {ex.Status} - {ex.ErrorCode}: {ex.Message}\");\n}\n```\n\n## Best Practices\n\n1. **Use `DefaultAzureCredential`** over API keys for production\n2. **Use `FieldBuilder`** with model attributes for type-safe index definitions\n3. **Use `CreateOrUpdateIndexAsync`** for idempotent index creation\n4. **Batch document operations** for better throughput\n5. **Use `Select`** to return only needed fields\n6. **Configure semantic search** for natural language queries\n7. **Combine vector + keyword + semantic** for best relevance\n\n## Reference Files\n\n| File | Contents |\n|------|----------|\n| [references\u002Fvector-search.md](references\u002Fvector-search.md) | Vector search, hybrid search, vectorizers |\n| [references\u002Fsemantic-search.md](references\u002Fsemantic-search.md) | Semantic ranking, captions, answers |\n",{"name":5,"license":15,"metadata":46,"description":49},{"author":12,"package":47,"version":48},"Azure.Search.Documents","1.0.0","Azure AI Search SDK for .NET (Azure.Search.Documents). Use for building search applications with full-text, vector, semantic, and hybrid search. Covers SearchClient (queries, document CRUD), SearchIndexClient (index management), and SearchIndexerClient (indexers, skillsets). Triggers: \"Azure Search .NET\", \"SearchClient\", \"SearchIndexClient\", \"vector search C#\", \"semantic search .NET\", \"hybrid search\", \"Azure.Search.Documents\".\n","main","3f5b461b2314e01c400564051e92469114c5b68f",".github\u002Fplugins\u002Fazure-sdk-dotnet\u002Fskills\u002Fazure-search-documents-dotnet",366,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fskills","https:\u002F\u002Fmicrosoft.github.io\u002Fskills\u002F","https:\u002F\u002Fgithub.com\u002Fmicrosoft","https:\u002F\u002Fopensource.microsoft.com","Open source projects and samples from Microsoft","2026-11-13 02:10:26",{"source":8,"skillName":5,"commands":61,"prompt":71,"zipAvailable":72},[62,65,68],{"tool":63,"command":64},"npx","npx skills add microsoft\u002Fskills --skill azure-search-documents-dotnet",{"tool":66,"command":67},"bunx","bunx skills add microsoft\u002Fskills --skill azure-search-documents-dotnet",{"tool":69,"command":70},"pnpm","pnpm dlx skills add microsoft\u002Fskills --skill azure-search-documents-dotnet","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fskills\u002Fblob\u002Fmain\u002F.github\u002Fplugins\u002Fazure-sdk-dotnet\u002Fskills\u002Fazure-search-documents-dotnet\u002FSKILL.md",true,[74,80],{"path":75,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":78,"sourceHtmlUrl":79},"references\u002Fsemantic-search.md","REFERENCE","参考文档",6923,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fskills\u002Fblob\u002Fmain\u002F.github\u002Fplugins\u002Fazure-sdk-dotnet\u002Fskills\u002Fazure-search-documents-dotnet\u002Freferences\u002Fsemantic-search.md",{"path":81,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":82,"sourceHtmlUrl":83},"references\u002Fvector-search.md",5969,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fskills\u002Fblob\u002Fmain\u002F.github\u002Fplugins\u002Fazure-sdk-dotnet\u002Fskills\u002Fazure-search-documents-dotnet\u002Freferences\u002Fvector-search.md",[85,111,148,175,195,232],{"skillNo":86,"name":87,"nameZh":6,"description":88,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":89,"categories":90,"keywords":96,"publishedAt":41},"01M69B4JCRQV5SPXAFCKXQRV0H","skill-creator","Guide for creating effective skills for AI coding agents working with Azure SDKs and Microsoft Foundry services. Use when creating new skills or updating existing skills.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fskills\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fskill-creator\u002FSKILL.md",[91],{"categoryNo":92,"categoryName":93,"taxonomyType":94,"taxonomyTypeDesc":95},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[97,98,99,9,100,101,102,21,103,104,105,34,106,29,107,28,108,109,110],"skill creator","creator","coding agents","foundry","microsoft foundry","ai coding agents","services","coding","guide","ai coding","sdks","Existing","when","new",{"skillNo":112,"name":113,"nameZh":6,"description":114,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":115,"categories":116,"keywords":127,"publishedAt":41},"01M69B4FD57V1MYKRWAJJECTZ7","podcast-generation","Generate AI-powered podcast-style audio narratives using Azure OpenAI's GPT Realtime Mini model via WebSocket. Use when building text-to-speech features, audio narrative generation, podcast creation from content, or integrating with Azure OpenAI Realtime API for real audio output. Covers full-stack implementation from React frontend to Python FastAPI backend with WebSocket streaming.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fskills\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fpodcast-generation\u002FSKILL.md",[117,120,123,126],{"categoryNo":118,"categoryName":119,"taxonomyType":94,"taxonomyTypeDesc":95},"01JBSEEDCAT000000000000009","前端开发",{"categoryNo":121,"categoryName":122,"taxonomyType":94,"taxonomyTypeDesc":95},"01JBSEEDCAT000000000000010","后端与接口",{"categoryNo":124,"categoryName":125,"taxonomyType":94,"taxonomyTypeDesc":95},"01JBSEEDCAT000000000000016","图像与多媒体",{"categoryNo":92,"categoryName":93,"taxonomyType":94,"taxonomyTypeDesc":95},[128,129,130,131,132,133,134,21,135,136,137,138,139,140,35,141,142,143,144,145,146,109,147],"podcast generation","podcast","generation","frontend","python","react","realtime","azure openai","generate","streaming","api","Audio","stack","model","fastapi","creation","python fastapi","narrative","features","fastapi backend",{"skillNo":149,"name":150,"nameZh":6,"description":151,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":152,"categories":153,"keywords":155,"publishedAt":41},"01M69B4CYPM5SESY5ZWEFDXEQZ","microsoft-docs","Understand Microsoft technologies by querying official documentation. Use whenever the user asks how something works, wants tutorials, needs configuration options, limits, quotas, or best practices for any Microsoft technology (Azure, .NET, M365, Windows, Power Platform, etc.)—even if they don't mention \"docs.\" If the question is about understanding a concept rather than writing code, this is the right skill.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fskills\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fmicrosoft-docs\u002FSKILL.md",[154],{"categoryNo":92,"categoryName":93,"taxonomyType":94,"taxonomyTypeDesc":95},[156,9,157,158,159,160,161,162,163,164,165,21,166,167,168,34,169,63,170,171,172,173,174,28],"docs","microsoft docs","MCP","writing","cli","mcp server","windows","power platform","official","documentation","learn","best practices","question","power","back","technology","platform","learn mcp","concept",{"skillNo":176,"name":177,"nameZh":6,"description":178,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":179,"categories":180,"keywords":182,"publishedAt":41},"01M69B49C3YPD1ZJ3NC0HPCY58","mcp-builder","Guide for creating high-quality MCP (Model Context Protocol) servers that enable LLMs to interact with external services through well-designed tools. Use when building MCP servers to integrate external APIs or services, whether in Python (FastMCP), Node\u002FTypeScript (MCP SDK), or C#\u002F.NET (Microsoft MCP SDK).","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fskills\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fmcp-builder\u002FSKILL.md",[181],{"categoryNo":92,"categoryName":93,"taxonomyType":94,"taxonomyTypeDesc":95},[158,183,184,185,132,186,26,187,9,188,189,141,190,191,105,34,192,193,194,29,28,109],"mcp builder","builder","typescript","llms","model context protocol","fastmcp","Tools","node","context","integrate","mcp sdk","building mcp servers",{"skillNo":196,"name":197,"nameZh":6,"description":198,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":199,"categories":200,"keywords":213,"publishedAt":41},"01M69B467A7CDMFQ0T6Q0ZA12Q","kql","KQL language expertise for writing correct, efficient Kusto Query Language queries. Covers syntax gotchas, join patterns, dynamic types, datetime pitfalls, regex patterns, serialization, memory management, result-size discipline, and advanced functions (geo, vector, graph). USE THIS SKILL whenever writing, debugging, or reviewing KQL queries — even simple ones — because the gotchas section prevents the most common errors that waste tool calls and cause expensive retry cascades. Trigger on: KQL, Kusto, ADX, Azure Data Explorer, Fabric Real-Time Intelligence, EventHouse, Log Analytics, log analysis, data exploration, time series, anomaly detection, summarize, where clause, join, extend, project, let statement, parse operator, extract function, any mention of pipe-forward query syntax.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fskills\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fkql\u002FSKILL.md",[201,204,205,210],{"categoryNo":202,"categoryName":203,"taxonomyType":94,"taxonomyTypeDesc":95},"01JBSEEDCAT000000000000018","写作与文案",{"categoryNo":92,"categoryName":93,"taxonomyType":94,"taxonomyTypeDesc":95},{"categoryNo":206,"categoryName":207,"taxonomyType":208,"taxonomyTypeDesc":209},"01JBSEEDCAT000000000000033","数据分析师","PROFESSION","适用职业",{"categoryNo":211,"categoryName":212,"taxonomyType":208,"taxonomyTypeDesc":209},"01JBSEEDCAT000000000000036","内容创作者",[197,159,214,215,216,21,38,217,218,219,220,221,222,223,224,225,226,227,228,28,229,230,231],"summarize","memory","analytics","time series","tool","discipline","log","geo","exploration","pipe","time","project","regex","join","datetime","section","anomaly","parse",{"skillNo":233,"name":234,"nameZh":6,"description":235,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":236,"categories":237,"keywords":238,"publishedAt":41},"01M69B44HJQ7897EZ7NE7DWQX3","github-issue-creator","Convert raw notes, error logs, voice dictation, or screenshots into crisp GitHub-flavored markdown issue reports. Use when the user pastes bug info, error messages, or informal descriptions and wants a structured GitHub issue. Supports images\u002FGIFs for visual evidence.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fskills\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fgithub-issue-creator\u002FSKILL.md",[],[239,240,241,242,98,243,244,245,246,247,248,249,34,250,251,252,253,254,255,28,109],"github","github issue creator","github issue","issue","issue creator","screenshots","notes","logs","error messages","messages","convert","evidence","reports","images","info","visual","error"]