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
相关产品推荐
相关产品推荐

