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

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

问题原因及解决办法

  1. 字段类型限制:Azure Cognitive Search中contains函数仅支持Edm.String类型字段,若track字段不是字符串类型(如枚举),会直接过滤失效。检查索引定义,确认track字段类型为Edm.String。

  2. 大小写敏感问题: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])
    
  3. 多值字段处理:若track是多值字符串数组字段,需用any操作符替代contains:

    filter_condition = " or ".join([f"track/any(t: t eq '{t.strip()}')" for t in track_list])
    
  4. 语法错误排查:打印生成的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 01:02:02