[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71RM645YN3W9FDYR45K1GY8":3,"skill-same:01M71RM645YN3W9FDYR45K1GY8":47},{"skillNo":4,"name":5,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":14,"categories":15,"keywords":16,"publishedAt":22,"linkOnly":23,"markdownContent":24,"markdownBody":25,"frontMatter":26,"refName":27,"commitSha":28,"skillDirectory":29,"forksCount":12,"repositoryHtmlUrl":30,"repositoryHomepageUrl":6,"ownerHtmlUrl":31,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":32,"install":33,"resources":46},"01M71RM645YN3W9FDYR45K1GY8","azure-search-documents-py",null,"javiertarazon\u002Fide-agente-free-jt7-","javiertarazon","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F153141207?v=4","01M71R52TB3S9HXKH6WSNT8A7V","01M71R52VG5KS2DKDDH4GDQ30A",0,"MIT","https:\u002F\u002Fgithub.com\u002Fjaviertarazon\u002Fide-agente-free-jt7-\u002Fblob\u002Frelease\u002Fv4.2.11-panel-pro\u002F.github\u002Fskills\u002Fazure-search-documents-py\u002FSKILL.md",[],[17,18,19,20,21],"documents","azure","azure search documents py","search","search documents","2026-11-10 13:02:02",false,"---\nname: azure-search-documents-py\ndescription: \"|\"\n  Azure AI Search SDK for Python. Use for vector search, hybrid search, semantic ranking, indexing, and skillsets.\n  Triggers: \"azure-search-documents\", \"SearchClient\", \"SearchIndexClient\", \"vector search\", \"hybrid search\", \"semantic search\".\npackage: azure-search-documents\nrisk: unknown\nsource: community\n---\n\n# Azure AI Search SDK for Python\n\nFull-text, vector, and hybrid search with AI enrichment capabilities.\n\n## Installation\n\n```bash\npip install azure-search-documents\n```\n\n## Environment Variables\n\n```bash\nAZURE_SEARCH_ENDPOINT=https:\u002F\u002F\u003Cservice-name>.search.windows.net\nAZURE_SEARCH_API_KEY=\u003Cyour-api-key>\nAZURE_SEARCH_INDEX_NAME=\u003Cyour-index-name>\n```\n\n## Authentication\n\n### API Key\n\n```python\nfrom azure.search.documents import SearchClient\nfrom azure.core.credentials import AzureKeyCredential\n\nclient = SearchClient(\n    endpoint=os.environ[\"AZURE_SEARCH_ENDPOINT\"],\n    index_name=os.environ[\"AZURE_SEARCH_INDEX_NAME\"],\n    credential=AzureKeyCredential(os.environ[\"AZURE_SEARCH_API_KEY\"])\n)\n```\n\n### Entra ID (Recommended)\n\n```python\nfrom azure.search.documents import SearchClient\nfrom azure.identity import DefaultAzureCredential\n\nclient = SearchClient(\n    endpoint=os.environ[\"AZURE_SEARCH_ENDPOINT\"],\n    index_name=os.environ[\"AZURE_SEARCH_INDEX_NAME\"],\n    credential=DefaultAzureCredential()\n)\n```\n\n## Client Types\n\n| Client | Purpose |\n|--------|---------|\n| `SearchClient` | Search and document operations |\n| `SearchIndexClient` | Index management, synonym maps |\n| `SearchIndexerClient` | Indexers, data sources, skillsets |\n\n## Create Index with Vector Field\n\n```python\nfrom azure.search.documents.indexes import SearchIndexClient\nfrom azure.search.documents.indexes.models import (\n    SearchIndex,\n    SearchField,\n    SearchFieldDataType,\n    VectorSearch,\n    HnswAlgorithmConfiguration,\n    VectorSearchProfile,\n    SearchableField,\n    SimpleField\n)\n\nindex_client = SearchIndexClient(endpoint, AzureKeyCredential(key))\n\nfields = [\n    SimpleField(name=\"id\", type=SearchFieldDataType.String, key=True),\n    SearchableField(name=\"title\", type=SearchFieldDataType.String),\n    SearchableField(name=\"content\", type=SearchFieldDataType.String),\n    SearchField(\n        name=\"content_vector\",\n        type=SearchFieldDataType.Collection(SearchFieldDataType.Single),\n        searchable=True,\n        vector_search_dimensions=1536,\n        vector_search_profile_name=\"my-vector-profile\"\n    )\n]\n\nvector_search = VectorSearch(\n    algorithms=[\n        HnswAlgorithmConfiguration(name=\"my-hnsw\")\n    ],\n    profiles=[\n        VectorSearchProfile(\n            name=\"my-vector-profile\",\n            algorithm_configuration_name=\"my-hnsw\"\n        )\n    ]\n)\n\nindex = SearchIndex(\n    name=\"my-index\",\n    fields=fields,\n    vector_search=vector_search\n)\n\nindex_client.create_or_update_index(index)\n```\n\n## Upload Documents\n\n```python\nfrom azure.search.documents import SearchClient\n\nclient = SearchClient(endpoint, \"my-index\", AzureKeyCredential(key))\n\ndocuments = [\n    {\n        \"id\": \"1\",\n        \"title\": \"Azure AI Search\",\n        \"content\": \"Full-text and vector search service\",\n        \"content_vector\": [0.1, 0.2, ...]  # 1536 dimensions\n    }\n]\n\nresult = client.upload_documents(documents)\nprint(f\"Uploaded {len(result)} documents\")\n```\n\n## Keyword Search\n\n```python\nresults = client.search(\n    search_text=\"azure search\",\n    select=[\"id\", \"title\", \"content\"],\n    top=10\n)\n\nfor result in results:\n    print(f\"{result['title']}: {result['@search.score']}\")\n```\n\n## Vector Search\n\n```python\nfrom azure.search.documents.models import VectorizedQuery\n\n# Your query embedding (1536 dimensions)\nquery_vector = get_embedding(\"semantic search capabilities\")\n\nvector_query = VectorizedQuery(\n    vector=query_vector,\n    k_nearest_neighbors=10,\n    fields=\"content_vector\"\n)\n\nresults = client.search(\n    vector_queries=[vector_query],\n    select=[\"id\", \"title\", \"content\"]\n)\n\nfor result in results:\n    print(f\"{result['title']}: {result['@search.score']}\")\n```\n\n## Hybrid Search (Vector + Keyword)\n\n```python\nfrom azure.search.documents.models import VectorizedQuery\n\nvector_query = VectorizedQuery(\n    vector=query_vector,\n    k_nearest_neighbors=10,\n    fields=\"content_vector\"\n)\n\nresults = client.search(\n    search_text=\"azure search\",\n    vector_queries=[vector_query],\n    select=[\"id\", \"title\", \"content\"],\n    top=10\n)\n```\n\n## Semantic Ranking\n\n```python\nfrom azure.search.documents.models import QueryType\n\nresults = client.search(\n    search_text=\"what is azure search\",\n    query_type=QueryType.SEMANTIC,\n    semantic_configuration_name=\"my-semantic-config\",\n    select=[\"id\", \"title\", \"content\"],\n    top=10\n)\n\nfor result in results:\n    print(f\"{result['title']}\")\n    if result.get(\"@search.captions\"):\n        print(f\"  Caption: {result['@search.captions'][0].text}\")\n```\n\n## Filters\n\n```python\nresults = client.search(\n    search_text=\"*\",\n    filter=\"category eq 'Technology' and rating gt 4\",\n    order_by=[\"rating desc\"],\n    select=[\"id\", \"title\", \"category\", \"rating\"]\n)\n```\n\n## Facets\n\n```python\nresults = client.search(\n    search_text=\"*\",\n    facets=[\"category,count:10\", \"rating\"],\n    top=0  # Only get facets, no documents\n)\n\nfor facet_name, facet_values in results.get_facets().items():\n    print(f\"{facet_name}:\")\n    for facet in facet_values:\n        print(f\"  {facet['value']}: {facet['count']}\")\n```\n\n## Autocomplete & Suggest\n\n```python\n# Autocomplete\nresults = client.autocomplete(\n    search_text=\"sea\",\n    suggester_name=\"my-suggester\",\n    mode=\"twoTerms\"\n)\n\n# Suggest\nresults = client.suggest(\n    search_text=\"sea\",\n    suggester_name=\"my-suggester\",\n    select=[\"title\"]\n)\n```\n\n## Indexer with Skillset\n\n```python\nfrom azure.search.documents.indexes import SearchIndexerClient\nfrom azure.search.documents.indexes.models import (\n    SearchIndexer,\n    SearchIndexerDataSourceConnection,\n    SearchIndexerSkillset,\n    EntityRecognitionSkill,\n    InputFieldMappingEntry,\n    OutputFieldMappingEntry\n)\n\nindexer_client = SearchIndexerClient(endpoint, AzureKeyCredential(key))\n\n# Create data source\ndata_source = SearchIndexerDataSourceConnection(\n    name=\"my-datasource\",\n    type=\"azureblob\",\n    connection_string=connection_string,\n    container={\"name\": \"documents\"}\n)\nindexer_client.create_or_update_data_source_connection(data_source)\n\n# Create skillset\nskillset = SearchIndexerSkillset(\n    name=\"my-skillset\",\n    skills=[\n        EntityRecognitionSkill(\n            inputs=[InputFieldMappingEntry(name=\"text\", source=\"\u002Fdocument\u002Fcontent\")],\n            outputs=[OutputFieldMappingEntry(name=\"organizations\", target_name=\"organizations\")]\n        )\n    ]\n)\nindexer_client.create_or_update_skillset(skillset)\n\n# Create indexer\nindexer = SearchIndexer(\n    name=\"my-indexer\",\n    data_source_name=\"my-datasource\",\n    target_index_name=\"my-index\",\n    skillset_name=\"my-skillset\"\n)\nindexer_client.create_or_update_indexer(indexer)\n```\n\n## Best Practices\n\n1. **Use hybrid search** for best relevance combining vector and keyword\n2. **Enable semantic ranking** for natural language queries\n3. **Index in batches** of 100-1000 documents for efficiency\n4. **Use filters** to narrow results before ranking\n5. **Configure vector dimensions** to match your embedding model\n6. **Use HNSW algorithm** for large-scale vector search\n7. **Create suggesters** at index creation time (cannot add later)\n\n## Reference Files\n\n| File | Contents |\n|------|----------|\n| references\u002Fvector-search.md | HNSW configuration, integrated vectorization, multi-vector queries |\n| references\u002Fsemantic-ranking.md | Semantic configuration, captions, answers, hybrid patterns |\n| scripts\u002Fsetup_vector_index.py | CLI script to create vector-enabled search index |\n\n\n---\n\n## Additional Azure AI Search Patterns\n\n# Azure AI Search Python SDK\n\nWrite clean, idiomatic Python code for Azure AI Search using `azure-search-documents`.\n\n## Installation\n\n```bash\npip install azure-search-documents azure-identity\n```\n\n## Environment Variables\n\n```bash\nAZURE_SEARCH_ENDPOINT=https:\u002F\u002F\u003Csearch-service>.search.windows.net\nAZURE_SEARCH_INDEX_NAME=\u003Cindex-name>\n# For API key auth (not recommended for production)\nAZURE_SEARCH_API_KEY=\u003Capi-key>\n```\n\n## Authentication\n\n**DefaultAzureCredential (preferred)**:\n```python\nfrom azure.identity import DefaultAzureCredential\nfrom azure.search.documents import SearchClient\n\ncredential = DefaultAzureCredential()\nclient = SearchClient(endpoint, index_name, credential)\n```\n\n**API Key**:\n```python\nfrom azure.core.credentials import AzureKeyCredential\nfrom azure.search.documents import SearchClient\n\nclient = SearchClient(endpoint, index_name, AzureKeyCredential(api_key))\n```\n\n## Client Selection\n\n| Client | Purpose |\n|--------|---------|\n| `SearchClient` | Query indexes, upload\u002Fupdate\u002Fdelete documents |\n| `SearchIndexClient` | Create\u002Fmanage indexes, knowledge sources, knowledge bases |\n| `SearchIndexerClient` | Manage indexers, skillsets, data sources |\n| `KnowledgeBaseRetrievalClient` | Agentic retrieval with LLM-powered Q&A |\n\n## Index Creation Pattern\n\n```python\nfrom azure.search.documents.indexes import SearchIndexClient\nfrom azure.search.documents.indexes.models import (\n    SearchIndex, SearchField, VectorSearch, VectorSearchProfile,\n    HnswAlgorithmConfiguration, AzureOpenAIVectorizer,\n    AzureOpenAIVectorizerParameters, SemanticSearch,\n    SemanticConfiguration, SemanticPrioritizedFields, SemanticField\n)\n\nindex = SearchIndex(\n    name=index_name,\n    fields=[\n        SearchField(name=\"id\", type=\"Edm.String\", key=True),\n        SearchField(name=\"content\", type=\"Edm.String\", searchable=True),\n        SearchField(name=\"embedding\", type=\"Collection(Edm.Single)\",\n                   vector_search_dimensions=3072,\n                   vector_search_profile_name=\"vector-profile\"),\n    ],\n    vector_search=VectorSearch(\n        profiles=[VectorSearchProfile(\n            name=\"vector-profile\",\n            algorithm_configuration_name=\"hnsw-algo\",\n            vectorizer_name=\"openai-vectorizer\"\n        )],\n        algorithms=[HnswAlgorithmConfiguration(name=\"hnsw-algo\")],\n        vectorizers=[AzureOpenAIVectorizer(\n            vectorizer_name=\"openai-vectorizer\",\n            parameters=AzureOpenAIVectorizerParameters(\n                resource_url=aoai_endpoint,\n                deployment_name=embedding_deployment,\n                model_name=embedding_model\n            )\n        )]\n    ),\n    semantic_search=SemanticSearch(\n        default_configuration_name=\"semantic-config\",\n        configurations=[SemanticConfiguration(\n            name=\"semantic-config\",\n            prioritized_fields=SemanticPrioritizedFields(\n                content_fields=[SemanticField(field_name=\"content\")]\n            )\n        )]\n    )\n)\n\nindex_client = SearchIndexClient(endpoint, credential)\nindex_client.create_or_update_index(index)\n```\n\n## Document Operations\n\n```python\nfrom azure.search.documents import SearchIndexingBufferedSender\n\n# Batch upload with automatic batching\nwith SearchIndexingBufferedSender(endpoint, index_name, credential) as sender:\n    sender.upload_documents(documents)\n\n# Direct operations via SearchClient\nsearch_client = SearchClient(endpoint, index_name, credential)\nsearch_client.upload_documents(documents)      # Add new\nsearch_client.merge_documents(documents)       # Update existing\nsearch_client.merge_or_upload_documents(documents)  # Upsert\nsearch_client.delete_documents(documents)      # Remove\n```\n\n## Search Patterns\n\n```python\n# Basic search\nresults = search_client.search(search_text=\"query\")\n\n# Vector search\nfrom azure.search.documents.models import VectorizedQuery\n\nresults = search_client.search(\n    search_text=None,\n    vector_queries=[VectorizedQuery(\n        vector=embedding,\n        k_nearest_neighbors=5,\n        fields=\"embedding\"\n    )]\n)\n\n# Hybrid search (vector + keyword)\nresults = search_client.search(\n    search_text=\"query\",\n    vector_queries=[VectorizedQuery(vector=embedding, k_nearest_neighbors=5, fields=\"embedding\")],\n    query_type=\"semantic\",\n    semantic_configuration_name=\"semantic-config\"\n)\n\n# With filters\nresults = search_client.search(\n    search_text=\"query\",\n    filter=\"category eq 'technology'\",\n    select=[\"id\", \"title\", \"content\"],\n    top=10\n)\n```\n\n## Agentic Retrieval (Knowledge Bases)\n\nFor LLM-powered Q&A with answer synthesis, see references\u002Fagentic-retrieval.md.\n\nKey concepts:\n- **Knowledge Source**: Points to a search index\n- **Knowledge Base**: Wraps knowledge sources + LLM for query planning and synthesis\n- **Output modes**: `EXTRACTIVE_DATA` (raw chunks) or `ANSWER_SYNTHESIS` (LLM-generated answers)\n\n## Async Pattern\n\n```python\nfrom azure.search.documents.aio import SearchClient\n\nasync with SearchClient(endpoint, index_name, credential) as client:\n    results = await client.search(search_text=\"query\")\n    async for result in results:\n        print(result[\"title\"])\n```\n\n## Best Practices\n\n1. **Use environment variables** for endpoints, keys, and deployment names\n2. **Prefer `DefaultAzureCredential`** over API keys for production\n3. **Use `SearchIndexingBufferedSender`** for batch uploads (handles batching\u002Fretries)\n4. **Always define semantic configuration** for agentic retrieval indexes\n5. **Use `create_or_update_index`** for idempotent index creation\n6. **Close clients** with context managers or explicit `close()`\n\n## Field Types Reference\n\n| EDM Type | Python | Notes |\n|----------|--------|-------|\n| `Edm.String` | str | Searchable text |\n| `Edm.Int32` | int | Integer |\n| `Edm.Int64` | int | Long integer |\n| `Edm.Double` | float | Floating point |\n| `Edm.Boolean` | bool | True\u002FFalse |\n| `Edm.DateTimeOffset` | datetime | ISO 8601 |\n| `Collection(Edm.Single)` | List[float] | Vector embeddings |\n| `Collection(Edm.String)` | List[str] | String arrays |\n\n## Error Handling\n\n```python\nfrom azure.core.exceptions import (\n    HttpResponseError,\n    ResourceNotFoundError,\n    ResourceExistsError\n)\n\ntry:\n    result = search_client.get_document(key=\"123\")\nexcept ResourceNotFoundError:\n    print(\"Document not found\")\nexcept HttpResponseError as e:\n    print(f\"Search error: {e.message}\")\n```\n\n## When to Use\nThis skill is applicable to execute the workflow or actions described in the overview.\n","# Azure AI Search SDK for Python\n\nFull-text, vector, and hybrid search with AI enrichment capabilities.\n\n## Installation\n\n```bash\npip install azure-search-documents\n```\n\n## Environment Variables\n\n```bash\nAZURE_SEARCH_ENDPOINT=https:\u002F\u002F\u003Cservice-name>.search.windows.net\nAZURE_SEARCH_API_KEY=\u003Cyour-api-key>\nAZURE_SEARCH_INDEX_NAME=\u003Cyour-index-name>\n```\n\n## Authentication\n\n### API Key\n\n```python\nfrom azure.search.documents import SearchClient\nfrom azure.core.credentials import AzureKeyCredential\n\nclient = SearchClient(\n    endpoint=os.environ[\"AZURE_SEARCH_ENDPOINT\"],\n    index_name=os.environ[\"AZURE_SEARCH_INDEX_NAME\"],\n    credential=AzureKeyCredential(os.environ[\"AZURE_SEARCH_API_KEY\"])\n)\n```\n\n### Entra ID (Recommended)\n\n```python\nfrom azure.search.documents import SearchClient\nfrom azure.identity import DefaultAzureCredential\n\nclient = SearchClient(\n    endpoint=os.environ[\"AZURE_SEARCH_ENDPOINT\"],\n    index_name=os.environ[\"AZURE_SEARCH_INDEX_NAME\"],\n    credential=DefaultAzureCredential()\n)\n```\n\n## Client Types\n\n| Client | Purpose |\n|--------|---------|\n| `SearchClient` | Search and document operations |\n| `SearchIndexClient` | Index management, synonym maps |\n| `SearchIndexerClient` | Indexers, data sources, skillsets |\n\n## Create Index with Vector Field\n\n```python\nfrom azure.search.documents.indexes import SearchIndexClient\nfrom azure.search.documents.indexes.models import (\n    SearchIndex,\n    SearchField,\n    SearchFieldDataType,\n    VectorSearch,\n    HnswAlgorithmConfiguration,\n    VectorSearchProfile,\n    SearchableField,\n    SimpleField\n)\n\nindex_client = SearchIndexClient(endpoint, AzureKeyCredential(key))\n\nfields = [\n    SimpleField(name=\"id\", type=SearchFieldDataType.String, key=True),\n    SearchableField(name=\"title\", type=SearchFieldDataType.String),\n    SearchableField(name=\"content\", type=SearchFieldDataType.String),\n    SearchField(\n        name=\"content_vector\",\n        type=SearchFieldDataType.Collection(SearchFieldDataType.Single),\n        searchable=True,\n        vector_search_dimensions=1536,\n        vector_search_profile_name=\"my-vector-profile\"\n    )\n]\n\nvector_search = VectorSearch(\n    algorithms=[\n        HnswAlgorithmConfiguration(name=\"my-hnsw\")\n    ],\n    profiles=[\n        VectorSearchProfile(\n            name=\"my-vector-profile\",\n            algorithm_configuration_name=\"my-hnsw\"\n        )\n    ]\n)\n\nindex = SearchIndex(\n    name=\"my-index\",\n    fields=fields,\n    vector_search=vector_search\n)\n\nindex_client.create_or_update_index(index)\n```\n\n## Upload Documents\n\n```python\nfrom azure.search.documents import SearchClient\n\nclient = SearchClient(endpoint, \"my-index\", AzureKeyCredential(key))\n\ndocuments = [\n    {\n        \"id\": \"1\",\n        \"title\": \"Azure AI Search\",\n        \"content\": \"Full-text and vector search service\",\n        \"content_vector\": [0.1, 0.2, ...]  # 1536 dimensions\n    }\n]\n\nresult = client.upload_documents(documents)\nprint(f\"Uploaded {len(result)} documents\")\n```\n\n## Keyword Search\n\n```python\nresults = client.search(\n    search_text=\"azure search\",\n    select=[\"id\", \"title\", \"content\"],\n    top=10\n)\n\nfor result in results:\n    print(f\"{result['title']}: {result['@search.score']}\")\n```\n\n## Vector Search\n\n```python\nfrom azure.search.documents.models import VectorizedQuery\n\n# Your query embedding (1536 dimensions)\nquery_vector = get_embedding(\"semantic search capabilities\")\n\nvector_query = VectorizedQuery(\n    vector=query_vector,\n    k_nearest_neighbors=10,\n    fields=\"content_vector\"\n)\n\nresults = client.search(\n    vector_queries=[vector_query],\n    select=[\"id\", \"title\", \"content\"]\n)\n\nfor result in results:\n    print(f\"{result['title']}: {result['@search.score']}\")\n```\n\n## Hybrid Search (Vector + Keyword)\n\n```python\nfrom azure.search.documents.models import VectorizedQuery\n\nvector_query = VectorizedQuery(\n    vector=query_vector,\n    k_nearest_neighbors=10,\n    fields=\"content_vector\"\n)\n\nresults = client.search(\n    search_text=\"azure search\",\n    vector_queries=[vector_query],\n    select=[\"id\", \"title\", \"content\"],\n    top=10\n)\n```\n\n## Semantic Ranking\n\n```python\nfrom azure.search.documents.models import QueryType\n\nresults = client.search(\n    search_text=\"what is azure search\",\n    query_type=QueryType.SEMANTIC,\n    semantic_configuration_name=\"my-semantic-config\",\n    select=[\"id\", \"title\", \"content\"],\n    top=10\n)\n\nfor result in results:\n    print(f\"{result['title']}\")\n    if result.get(\"@search.captions\"):\n        print(f\"  Caption: {result['@search.captions'][0].text}\")\n```\n\n## Filters\n\n```python\nresults = client.search(\n    search_text=\"*\",\n    filter=\"category eq 'Technology' and rating gt 4\",\n    order_by=[\"rating desc\"],\n    select=[\"id\", \"title\", \"category\", \"rating\"]\n)\n```\n\n## Facets\n\n```python\nresults = client.search(\n    search_text=\"*\",\n    facets=[\"category,count:10\", \"rating\"],\n    top=0  # Only get facets, no documents\n)\n\nfor facet_name, facet_values in results.get_facets().items():\n    print(f\"{facet_name}:\")\n    for facet in facet_values:\n        print(f\"  {facet['value']}: {facet['count']}\")\n```\n\n## Autocomplete & Suggest\n\n```python\n# Autocomplete\nresults = client.autocomplete(\n    search_text=\"sea\",\n    suggester_name=\"my-suggester\",\n    mode=\"twoTerms\"\n)\n\n# Suggest\nresults = client.suggest(\n    search_text=\"sea\",\n    suggester_name=\"my-suggester\",\n    select=[\"title\"]\n)\n```\n\n## Indexer with Skillset\n\n```python\nfrom azure.search.documents.indexes import SearchIndexerClient\nfrom azure.search.documents.indexes.models import (\n    SearchIndexer,\n    SearchIndexerDataSourceConnection,\n    SearchIndexerSkillset,\n    EntityRecognitionSkill,\n    InputFieldMappingEntry,\n    OutputFieldMappingEntry\n)\n\nindexer_client = SearchIndexerClient(endpoint, AzureKeyCredential(key))\n\n# Create data source\ndata_source = SearchIndexerDataSourceConnection(\n    name=\"my-datasource\",\n    type=\"azureblob\",\n    connection_string=connection_string,\n    container={\"name\": \"documents\"}\n)\nindexer_client.create_or_update_data_source_connection(data_source)\n\n# Create skillset\nskillset = SearchIndexerSkillset(\n    name=\"my-skillset\",\n    skills=[\n        EntityRecognitionSkill(\n            inputs=[InputFieldMappingEntry(name=\"text\", source=\"\u002Fdocument\u002Fcontent\")],\n            outputs=[OutputFieldMappingEntry(name=\"organizations\", target_name=\"organizations\")]\n        )\n    ]\n)\nindexer_client.create_or_update_skillset(skillset)\n\n# Create indexer\nindexer = SearchIndexer(\n    name=\"my-indexer\",\n    data_source_name=\"my-datasource\",\n    target_index_name=\"my-index\",\n    skillset_name=\"my-skillset\"\n)\nindexer_client.create_or_update_indexer(indexer)\n```\n\n## Best Practices\n\n1. **Use hybrid search** for best relevance combining vector and keyword\n2. **Enable semantic ranking** for natural language queries\n3. **Index in batches** of 100-1000 documents for efficiency\n4. **Use filters** to narrow results before ranking\n5. **Configure vector dimensions** to match your embedding model\n6. **Use HNSW algorithm** for large-scale vector search\n7. **Create suggesters** at index creation time (cannot add later)\n\n## Reference Files\n\n| File | Contents |\n|------|----------|\n| references\u002Fvector-search.md | HNSW configuration, integrated vectorization, multi-vector queries |\n| references\u002Fsemantic-ranking.md | Semantic configuration, captions, answers, hybrid patterns |\n| scripts\u002Fsetup_vector_index.py | CLI script to create vector-enabled search index |\n\n\n---\n\n## Additional Azure AI Search Patterns\n\n# Azure AI Search Python SDK\n\nWrite clean, idiomatic Python code for Azure AI Search using `azure-search-documents`.\n\n## Installation\n\n```bash\npip install azure-search-documents azure-identity\n```\n\n## Environment Variables\n\n```bash\nAZURE_SEARCH_ENDPOINT=https:\u002F\u002F\u003Csearch-service>.search.windows.net\nAZURE_SEARCH_INDEX_NAME=\u003Cindex-name>\n# For API key auth (not recommended for production)\nAZURE_SEARCH_API_KEY=\u003Capi-key>\n```\n\n## Authentication\n\n**DefaultAzureCredential (preferred)**:\n```python\nfrom azure.identity import DefaultAzureCredential\nfrom azure.search.documents import SearchClient\n\ncredential = DefaultAzureCredential()\nclient = SearchClient(endpoint, index_name, credential)\n```\n\n**API Key**:\n```python\nfrom azure.core.credentials import AzureKeyCredential\nfrom azure.search.documents import SearchClient\n\nclient = SearchClient(endpoint, index_name, AzureKeyCredential(api_key))\n```\n\n## Client Selection\n\n| Client | Purpose |\n|--------|---------|\n| `SearchClient` | Query indexes, upload\u002Fupdate\u002Fdelete documents |\n| `SearchIndexClient` | Create\u002Fmanage indexes, knowledge sources, knowledge bases |\n| `SearchIndexerClient` | Manage indexers, skillsets, data sources |\n| `KnowledgeBaseRetrievalClient` | Agentic retrieval with LLM-powered Q&A |\n\n## Index Creation Pattern\n\n```python\nfrom azure.search.documents.indexes import SearchIndexClient\nfrom azure.search.documents.indexes.models import (\n    SearchIndex, SearchField, VectorSearch, VectorSearchProfile,\n    HnswAlgorithmConfiguration, AzureOpenAIVectorizer,\n    AzureOpenAIVectorizerParameters, SemanticSearch,\n    SemanticConfiguration, SemanticPrioritizedFields, SemanticField\n)\n\nindex = SearchIndex(\n    name=index_name,\n    fields=[\n        SearchField(name=\"id\", type=\"Edm.String\", key=True),\n        SearchField(name=\"content\", type=\"Edm.String\", searchable=True),\n        SearchField(name=\"embedding\", type=\"Collection(Edm.Single)\",\n                   vector_search_dimensions=3072,\n                   vector_search_profile_name=\"vector-profile\"),\n    ],\n    vector_search=VectorSearch(\n        profiles=[VectorSearchProfile(\n            name=\"vector-profile\",\n            algorithm_configuration_name=\"hnsw-algo\",\n            vectorizer_name=\"openai-vectorizer\"\n        )],\n        algorithms=[HnswAlgorithmConfiguration(name=\"hnsw-algo\")],\n        vectorizers=[AzureOpenAIVectorizer(\n            vectorizer_name=\"openai-vectorizer\",\n            parameters=AzureOpenAIVectorizerParameters(\n                resource_url=aoai_endpoint,\n                deployment_name=embedding_deployment,\n                model_name=embedding_model\n            )\n        )]\n    ),\n    semantic_search=SemanticSearch(\n        default_configuration_name=\"semantic-config\",\n        configurations=[SemanticConfiguration(\n            name=\"semantic-config\",\n            prioritized_fields=SemanticPrioritizedFields(\n                content_fields=[SemanticField(field_name=\"content\")]\n            )\n        )]\n    )\n)\n\nindex_client = SearchIndexClient(endpoint, credential)\nindex_client.create_or_update_index(index)\n```\n\n## Document Operations\n\n```python\nfrom azure.search.documents import SearchIndexingBufferedSender\n\n# Batch upload with automatic batching\nwith SearchIndexingBufferedSender(endpoint, index_name, credential) as sender:\n    sender.upload_documents(documents)\n\n# Direct operations via SearchClient\nsearch_client = SearchClient(endpoint, index_name, credential)\nsearch_client.upload_documents(documents)      # Add new\nsearch_client.merge_documents(documents)       # Update existing\nsearch_client.merge_or_upload_documents(documents)  # Upsert\nsearch_client.delete_documents(documents)      # Remove\n```\n\n## Search Patterns\n\n```python\n# Basic search\nresults = search_client.search(search_text=\"query\")\n\n# Vector search\nfrom azure.search.documents.models import VectorizedQuery\n\nresults = search_client.search(\n    search_text=None,\n    vector_queries=[VectorizedQuery(\n        vector=embedding,\n        k_nearest_neighbors=5,\n        fields=\"embedding\"\n    )]\n)\n\n# Hybrid search (vector + keyword)\nresults = search_client.search(\n    search_text=\"query\",\n    vector_queries=[VectorizedQuery(vector=embedding, k_nearest_neighbors=5, fields=\"embedding\")],\n    query_type=\"semantic\",\n    semantic_configuration_name=\"semantic-config\"\n)\n\n# With filters\nresults = search_client.search(\n    search_text=\"query\",\n    filter=\"category eq 'technology'\",\n    select=[\"id\", \"title\", \"content\"],\n    top=10\n)\n```\n\n## Agentic Retrieval (Knowledge Bases)\n\nFor LLM-powered Q&A with answer synthesis, see references\u002Fagentic-retrieval.md.\n\nKey concepts:\n- **Knowledge Source**: Points to a search index\n- **Knowledge Base**: Wraps knowledge sources + LLM for query planning and synthesis\n- **Output modes**: `EXTRACTIVE_DATA` (raw chunks) or `ANSWER_SYNTHESIS` (LLM-generated answers)\n\n## Async Pattern\n\n```python\nfrom azure.search.documents.aio import SearchClient\n\nasync with SearchClient(endpoint, index_name, credential) as client:\n    results = await client.search(search_text=\"query\")\n    async for result in results:\n        print(result[\"title\"])\n```\n\n## Best Practices\n\n1. **Use environment variables** for endpoints, keys, and deployment names\n2. **Prefer `DefaultAzureCredential`** over API keys for production\n3. **Use `SearchIndexingBufferedSender`** for batch uploads (handles batching\u002Fretries)\n4. **Always define semantic configuration** for agentic retrieval indexes\n5. **Use `create_or_update_index`** for idempotent index creation\n6. **Close clients** with context managers or explicit `close()`\n\n## Field Types Reference\n\n| EDM Type | Python | Notes |\n|----------|--------|-------|\n| `Edm.String` | str | Searchable text |\n| `Edm.Int32` | int | Integer |\n| `Edm.Int64` | int | Long integer |\n| `Edm.Double` | float | Floating point |\n| `Edm.Boolean` | bool | True\u002FFalse |\n| `Edm.DateTimeOffset` | datetime | ISO 8601 |\n| `Collection(Edm.Single)` | List[float] | Vector embeddings |\n| `Collection(Edm.String)` | List[str] | String arrays |\n\n## Error Handling\n\n```python\nfrom azure.core.exceptions import (\n    HttpResponseError,\n    ResourceNotFoundError,\n    ResourceExistsError\n)\n\ntry:\n    result = search_client.get_document(key=\"123\")\nexcept ResourceNotFoundError:\n    print(\"Document not found\")\nexcept HttpResponseError as e:\n    print(f\"Search error: {e.message}\")\n```\n\n## When to Use\nThis skill is applicable to execute the workflow or actions described in the overview.\n",{},"release\u002Fv4.2.11-panel-pro","a92ea02bcf7e2b3dbaf46d49696c29a3cb490d4f",".github\u002Fskills\u002Fazure-search-documents-py","https:\u002F\u002Fgithub.com\u002Fjaviertarazon\u002Fide-agente-free-jt7-","https:\u002F\u002Fgithub.com\u002Fjaviertarazon","2026-07-12 07:10:45",{"source":7,"skillName":5,"commands":34,"prompt":44,"zipAvailable":45},[35,38,41],{"tool":36,"command":37},"npx","npx skills add javiertarazon\u002Fide-agente-free-jt7- --skill azure-search-documents-py",{"tool":39,"command":40},"bunx","bunx skills add javiertarazon\u002Fide-agente-free-jt7- --skill azure-search-documents-py",{"tool":42,"command":43},"pnpm","pnpm dlx skills add javiertarazon\u002Fide-agente-free-jt7- --skill azure-search-documents-py","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fjaviertarazon\u002Fide-agente-free-jt7-\u002Fblob\u002Frelease\u002Fv4.2.11-panel-pro\u002F.github\u002Fskills\u002Fazure-search-documents-py\u002FSKILL.md",true,[],[48,80,106,126,141,163],{"skillNo":49,"name":50,"nameZh":6,"description":51,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":52,"categories":53,"keywords":59,"publishedAt":22},"01M71TQ7Q6Z10VWF3C2H5X1KW9","zustand-store-ts","Create Zustand stores with TypeScript, subscribeWithSelector middleware, and proper state\u002Faction separation. Use when building React state management, creating global stores, or implementing reacti...","https:\u002F\u002Fgithub.com\u002Fjaviertarazon\u002Fide-agente-free-jt7-\u002Fblob\u002Frelease\u002Fv4.2.11-panel-pro\u002F.github\u002Fskills\u002Fzustand-store-ts\u002FSKILL.md",[54],{"categoryNo":55,"categoryName":56,"taxonomyType":57,"taxonomyTypeDesc":58},"01JBSEEDCAT000000000000009","前端开发","SCENARIO","使用场景",[60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79],"zustand","store","zustand store ts","community","middleware","implementing","use","react state management","when","unknown","react","with","state","create","state management","typescript","action","management","separation","global",{"skillNo":81,"name":82,"nameZh":6,"description":83,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":84,"categories":85,"keywords":89,"publishedAt":22},"01M71TQ5EAR40G6W0MV5ZDVEZT","zoom-automation","Automate Zoom meeting creation, management, recordings, webinars, and participant tracking via Rube MCP (Composio). Always search tools first for current schemas.","https:\u002F\u002Fgithub.com\u002Fjaviertarazon\u002Fide-agente-free-jt7-\u002Fblob\u002Frelease\u002Fv4.2.11-panel-pro\u002F.github\u002Fskills\u002Fzoom-automation\u002FSKILL.md",[86],{"categoryNo":87,"categoryName":88,"taxonomyType":57,"taxonomyTypeDesc":58},"01JBSEEDCAT000000000000023","Skill与智能体开发",[90,91,92,63,93,94,20,95,96,69,97,98,99,100,101,102,103,104,77,105],"zoom automation","zoom","automation","creation","for","schemas","MCP","first","via","meeting","search tools","tracking","webinars","composio","recordings","Tools",{"skillNo":107,"name":108,"nameZh":6,"description":109,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":110,"categories":111,"keywords":113,"publishedAt":22},"01M71TQ29B1EYBCEAP1ZBGXQ1A","zoho-crm-automation","Automate Zoho CRM tasks via Rube MCP (Composio): create\u002Fupdate records, search contacts, manage leads, and convert leads. Always search tools first for current schemas.","https:\u002F\u002Fgithub.com\u002Fjaviertarazon\u002Fide-agente-free-jt7-\u002Fblob\u002Frelease\u002Fv4.2.11-panel-pro\u002F.github\u002Fskills\u002Fzoho-crm-automation\u002FSKILL.md",[112],{"categoryNo":87,"categoryName":88,"taxonomyType":57,"taxonomyTypeDesc":58},[114,115,92,116,117,118,63,119,120,94,121,20,95,122,96,69,123,124,125,73],"crm automation","zoho crm automation","crm","zoho crm","zoho","leads","manage leads","manage","records","convert","tasks","contacts",{"skillNo":127,"name":128,"nameZh":6,"description":129,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":130,"categories":131,"keywords":133,"publishedAt":22},"01M71TPZPMN60DH0XV58KVHY23","zendesk-automation","Automate Zendesk tasks via Rube MCP (Composio): tickets, users, organizations, replies. Always search tools first for current schemas.","https:\u002F\u002Fgithub.com\u002Fjaviertarazon\u002Fide-agente-free-jt7-\u002Fblob\u002Frelease\u002Fv4.2.11-panel-pro\u002F.github\u002Fskills\u002Fzendesk-automation\u002FSKILL.md",[132],{"categoryNo":87,"categoryName":88,"taxonomyType":57,"taxonomyTypeDesc":58},[134,92,135,63,94,20,95,96,136,69,124,137,138,97,98,139,100,103,105,140],"zendesk automation","zendesk","organizations","replies","users","tickets","automate",{"skillNo":142,"name":143,"nameZh":6,"description":144,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":145,"categories":146,"keywords":147,"publishedAt":22},"01M71TPXDWKHKG4N6TVEPXWD0N","zapier-make-patterns","No-code automation democratizes workflow building. Zapier and Make (formerly Integromat) let non-developers automate business processes without writing code. But no-code doesn't mean no-complexity ...","https:\u002F\u002Fgithub.com\u002Fjaviertarazon\u002Fide-agente-free-jt7-\u002Fblob\u002Frelease\u002Fv4.2.11-panel-pro\u002F.github\u002Fskills\u002Fzapier-make-patterns\u002FSKILL.md",[],[148,149,150,151,152,153,154,155,156,92,157,69,158,159,160,161,162,140],"zapier make patterns","zapier","patterns","make","No-Code","complexity","writing","spawner","business","workflow","code","integromat","apache","processes","but",{"skillNo":164,"name":165,"nameZh":6,"description":166,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":6,"repositoryNo":11,"starsCount":12,"licenseSpdxId":13,"licenseFileUrl":6,"sourceHtmlUrl":167,"categories":168,"keywords":172,"publishedAt":22},"01M71TPT5T10WXNKW9G7ZXZ27W","youtube-summarizer","Extract transcripts from YouTube videos and generate comprehensive, detailed summaries using intelligent analysis frameworks","https:\u002F\u002Fgithub.com\u002Fjaviertarazon\u002Fide-agente-free-jt7-\u002Fblob\u002Frelease\u002Fv4.2.11-panel-pro\u002F.github\u002Fskills\u002Fyoutube-summarizer\u002FSKILL.md",[169],{"categoryNo":170,"categoryName":171,"taxonomyType":57,"taxonomyTypeDesc":58},"01JBSEEDCAT000000000000016","图像与多媒体",[173,174,175,176,63,177,178,179,180,181,182,183,158,184,185,186,187,188,189,190],"summarizer","youtube","youtube summarizer","Video","content-analysis","frameworks","copilot","2025","github-copilot","extract transcripts","analysis","codex","cli","summaries","github","generate","summarization","2026"]