Python调用Azure OpenAI搜索服务:Contains查询无结果问题
Azure OpenAI 搜索多Track过滤无结果排查
我在使用Python代码从Azure OpenAI检索搜索结果时遇到问题:当使用单个Track,用eq条件过滤时能正常返回结果,但修改为contains条件以支持多Track查询后,完全无法获取到结果。
原可正常运行的代码
def search_knowledgebase(search_query, track=None): with tracer.span(name='search_knowledgebase'): vector = Vector(value=generate_embeddings(search_query), k=3, fields='embedding') print('search query: ', search_query) text_content = '' if track == 'Voice': track = 'OV' filter_condition = "track eq '" + track + "'" if track not in (None, 'All') else None # Search KBs with tracer.span(name='search_kb'): results = search_client.search( search_text=search_query, vectors=[vector], select=['id', 'title', 'content', 'track', 'keywords'], query_type='semantic', query_language='en-us', semantic_configuration_name='my-semantic-config', query_caption='extractive', query_answer='extractive', facets=['track'], filter=filter_condition, top=3 ) kb_found = False if results: for result in results: if result['@search.reranker_score'] >= 2: if not kb_found: text_content += 'KB Results:\n' kb_found = True text_content += f'Score:{result['@search.reranker_score']}<a href="' \ f'{kb_base_url}{result['id']}{kb_url_suffix}">' \ f'{result['title']}</a>' \ f'\nKeywords: {result['keywords']}\n' \ f'\n{result['content']}\n' if track != 'Consumer': results = wiki_search_client.search( search_text=search_query, vectors= [vector], select=['path', 'filename', 'content'], query_type='semantic', query_language='en-us', semantic_configuration_name='my-semantic-config', query_caption='extractive', query_answer='extractive|count-3', top=3 ) wiki_found = False if results: for result in results: if result['@search.reranker_score'] >= 2: if not wiki_found: text_content += 'Wiki Results:\n' kb_found = True page_path = get_page_path(result['path'], result['filename']) text_content += f'Score: {result['@search.reranker_score']}<a href="' \ f'{wiki_base_url}{page_path}">' \ f'{result['filename']}</a>\n{summarize(result['content'])}\n' if not text_content: text_content = 'No KB or Wiki results found.' print('text_content', text_content) return text_content
修改后无结果的代码
def search_knowledgebase(search_query, track=None): with tracer.span(name='search_knowledgebase'): vector = Vector(value=generate_embeddings(search_query), k=3, fields='embedding') print('search query: ', search_query) text_content = '' if track == 'Voice': track = 'OV' if track not in (None, 'All'): track_list = track.split(',') filter_condition = " or ".join([f"contains(track, '{t.strip()}')" for t in track_list]) else: filter_condition = None # Search KBs with tracer.span(name='search_kb'): results = search_client.search( search_text=search_query, vectors=[vector], select=['id', 'title', 'content', 'track', 'keywords'], query_type='semantic', query_language='en-us', semantic_configuration_name='my-semantic-config', query_caption='extractive', query_answer='extractive', facets=['track'], filter=filter_condition, top=3 ) kb_found = False if results: for result in results: if result['@search.reranker_score'] >= 2: if not kb_found: text_content += 'KB Results:\n' kb_found = True text_content += f'Score:{result['@search.reranker_score']}<a href="' \ f'{kb_base_url}{result['id']}{kb_url_suffix}">' \ f'{result['title']}</a>' \ f'\nKeywords: {result['keywords']}\n' \ f'\n{result['content']}\n' if track != 'Consumer': results = wiki_search_client.search( search_text=search_query, vectors= [vector], select=['path', 'filename', 'content'], query_type='semantic', query_language='en-us', semantic_configuration_name='my-semantic-config', query_caption='extractive', query_answer='extractive|count-3', top=3 ) wiki_found = False if results: for result in results: if result['@search.reranker_score'] >= 2: if not wiki_found: text_content += 'Wiki Results:\n' kb_found = True page_path = get_page_path(result['path'], result['filename']) text_content += f'Score: {result['@search.reranker_score']}<a href="' \ f'{wiki_base_url}{page_path}">' \ f'{result['filename']}</a>\n{summarize(result['content'])}\n' if not text_content: text_content = 'No KB or Wiki results found.' print('text_content', text_content) return text_content
核心修改片段
原代码
filter_condition = "track eq '" + track + "'" if track not in (None, 'All') else None
修改后代码
if track not in (None, 'All'): track_list = track.split(',') filter_condition = " or ".join([f"contains(track, '{t.strip()}')" for t in track_list]) else: filter_condition = None
问题原因及解决办法
字段类型限制:Azure Cognitive Search中
contains函数仅支持Edm.String类型字段,若track字段不是字符串类型(如枚举),会直接过滤失效。检查索引定义,确认track字段类型为Edm.String。大小写敏感问题:
contains是大小写敏感的,若索引中track存储为大写(如"OV")但传入参数为小写,会匹配失败。可统一大小写后构建条件:filter_condition = " or ".join([f"contains(track, '{t.strip().upper()}')" for t in track_list])或使用大小写不敏感匹配:
filter_condition = " or ".join([f"tolower(track) eq '{t.strip().lower()}'" for t in track_list])多值字段处理:若
track是多值字符串数组字段,需用any操作符替代contains:filter_condition = " or ".join([f"track/any(t: t eq '{t.strip()}')" for t in track_list])语法错误排查:打印生成的
filter_condition值,检查是否有单引号未转义的问题(若track值含单引号会破坏语法),可添加转义逻辑:def escape_single_quotes(s): return s.replace("'", "''") filter_condition = " or ".join([f"contains(track, '{escape_single_quotes(t.strip())}')" for t in track_list])
内容的提问来源于stack exchange,提问作者Diwakar Reddy
相关产品推荐
相关产品推荐

