You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure Cognitive Search删除向量条目报错:缺少必填batch参数

问题描述

我正在开发一个Azure Function,当Azure Cosmos DB容器中的文档被标记为已删除时触发。触发后,需要删除Cosmos DB中关联的消息,同时移除Azure Cognitive Search中对应的向量条目。以下是用于Azure Cognitive Search删除操作的相关代码:

import azure.functions as func
from azure.cosmos import CosmosClient, exceptions
from azure.core.credentials import AzureKeyCredential
from azure.search.documents import SearchClient
import os
import logging

chat_deletion_trigger = func.Blueprint()

@chat_deletion_trigger.cosmos_db_trigger(
    connection="CosmosDBConnectionString",
    database_name="ChatDatabase",
    container_name="Chats",
    lease_container_name="leases",
    create_lease_container_if_not_exists=True,
    arg_name="documents"
)
def ChatDeletionTrigger(documents: func.DocumentList) -> None:
    logging.info("ChatDeletionTrigger function started processing.")

    cosmos_client = CosmosClient.from_connection_string(os.environ['CosmosDBConnectionString'])
    database_name = 'ChatDatabase'
    database = cosmos_client.get_database_client(database_name)
    messages_container = database.get_container_client('Messages')

    search_client = SearchClient(
        endpoint=os.getenv('SearchServiceEndpoint'),
        index_name="azureblob-index",
        credential=AzureKeyCredential(os.getenv('SearchServiceKey'))
    )

    for document in documents:
        chat_id = document.get('id')
        is_deleted = document.get('isDeleted', False)

        if not chat_id:
            logging.error("Document does not have an 'id' field. Skipping document.")
            continue

        if not is_deleted:
            logging.info(f"Chat with id: {chat_id} is not marked as deleted. Skipping document.")
            continue

        logging.info(f"Processing deletion of messages and vector entries associated with chat id: {chat_id}")

        try:
            messages_container.scripts.execute_stored_procedure(
                sproc="deleteMessagesByChatId",
                params=[chat_id],
                partition_key=chat_id
            )
            logging.info(f"Deleted messages associated with chatId {chat_id} using stored procedure.")

        except exceptions.CosmosHttpResponseError as e:
            logging.error(f"Error deleting messages for chat id {chat_id}: {str(e)}")

        try:
            results = search_client.search(search_text="", filter=f"chatId eq '{chat_id}'")

            document_ids = [doc['documentId'] for doc in results]

            if document_ids:
                delete_actions = [{"@search.action": "delete", "documentId": doc_id} for doc_id in document_ids]
                batch = {"value": delete_actions}
                search_client.index_documents(batch=batch)
                logging.info(f"Deleted vector entries for chatId: {chat_id}")

            else:
                logging.info(f"No vector entries found for chatId: {chat_id}")

        except Exception as e:
            logging.error(f"Error deleting vector entries for chat id {chat_id}: {str(e)}")

    logging.info("ChatDeletionTrigger function completed processing.")

执行删除操作时收到错误:
Error deleting vector entries for chat id {chat_id}: SearchClient.index_documents() missing 1 required positional argument: 'batch'

请问如何正确向Azure Cognitive Search的index_documents方法传递删除操作的批量参数?是批量参数结构错误,还是有其他遗漏?


解决方案

错误源于index_documents方法的调用方式不正确:该方法不需要传入batch关键字参数,也不需要手动将操作列表包装成{"value": ...}的结构,直接传递操作对象列表即可。

修改后的代码片段

try:
    results = search_client.search(search_text="", filter=f"chatId eq '{chat_id}'")

    document_ids = [doc['documentId'] for doc in results]

    if document_ids:
        delete_actions = [{"@search.action": "delete", "documentId": doc_id} for doc_id in document_ids]
        # 直接传入操作列表,无需外层batch字典
        search_client.index_documents(delete_actions)
        logging.info(f"Deleted vector entries for chatId: {chat_id}")

    else:
        logging.info(f"No vector entries found for chatId: {chat_id}")

except Exception as e:
    logging.error(f"Error deleting vector entries for chat id {chat_id}: {str(e)}")

关键说明

  • Azure Cognitive Search Python SDK的index_documents方法接受的参数是操作对象的列表,每个对象需包含@search.action(这里为delete)和文档的键字段(你的索引中是documentId)。
  • SDK会自动处理请求格式的转换,无需手动添加{"value": ...}外层结构。
  • 额外检查:确认documentId是你搜索索引中定义的键字段,如果键字段名称不同,需替换为对应名称,否则删除操作会因找不到目标文档而失效。

内容的提问来源于stack exchange,提问作者Shravan K Subrahmanya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 04:33:24