如何在azure-search-openai-demo中实现单文件搜索?
如何将azure-search-openai-demo的搜索范围限制为单个文件
要实现仅搜索指定单个文件,核心是给Azure Cognitive Search的查询添加文件名筛选条件,需从「前端传参」和「后端搜索逻辑修改」两部分入手:
1. 前端请求添加目标文件名参数
调用/chat_stream接口时,在请求JSON的context.overrides中新增target_filename字段,指定要搜索的完整文件名(含扩展名,比如annual-report.pdf):
{ "messages": [{"role": "user", "content": "请提炼这份文件的核心观点"}], "context": { "overrides": { "target_filename": "annual-report.pdf" } } }
2. 后端修改搜索逻辑
步骤1:确保参数传递
你提供的chat_stream函数已将context参数传递给approach.run_stream,无需修改这部分代码,确保target_filename能被后续搜索逻辑读取即可。
步骤2:给搜索查询添加筛选条件
找到对应Approach类的搜索实现代码(通常在approaches/目录下,比如chat_read_retrieve_read.py的_search方法),添加筛选逻辑:
async def _search(self, query_text: str, context: dict) -> List[Document]: # 获取前端传入的目标文件名 target_filename = context.get("overrides", {}).get("target_filename") # 构建筛选表达式:Azure Search默认用metadata_storage_name存储Blob文件名 filter_expr = None if target_filename: # 转义文件名中的单引号,避免搜索语法错误 escaped_filename = target_filename.replace("'", "''") filter_expr = f"metadata_storage_name eq '{escaped_filename}'" # 执行带筛选条件的搜索 results = await self.search_client.search( query_text, top=self.top, filter=filter_expr, # 新增筛选参数 query_type="semantic", semantic_configuration_name=self.semantic_config_name, query_caption="extractive", query_answer="extractive", ) # 后续结果处理代码...
关键说明
- Azure Cognitive Search索引Blob存储时,默认会将Blob文件名存入
metadata_storage_name字段,用该字段筛选最准确;若你自定义了文件名索引字段,替换为对应字段名即可。 - 保留兼容逻辑:当未传入
target_filename时,filter_expr为None,会默认搜索所有文件,不影响原有功能。
内容的提问来源于stack exchange,提问作者ravi
相关产品推荐
相关产品推荐

