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

Azure Search Service搜索结果仅前50条路径解码异常求助

解决方案

原因定位

Azure Search Service 默认每页返回50条结果,你的代码仅处理了第一页数据,后续分页的结果未执行解码逻辑就被直接返回。另外,GetResults() 返回的是延迟加载的 IEnumerable,如果没有完整枚举所有分页结果,解码操作只会作用在第一页数据上。

具体解决步骤

1. 显式遍历所有分页结果

Azure Search单页最大返回1000条,若结果总数超过1000,必须循环分页获取;若少于1000,可直接设置Size参数覆盖默认值:

// 假设你的SearchClient实例为_searchClient
var searchOptions = new SearchOptions
{
    IncludeTotalCount = true,
    // 单页最大支持1000条,若总条数≤1000可直接设置为总计数
    Size = 1000
};

var response = await _searchClient.SearchAsync<YourDocumentType>("your-query", searchOptions);
var allResults = new List<YourDocumentType>();

// 处理第一页结果
await foreach (var result in response.GetResultsAsync())
{
    // 解码metadata_storage_path
    result.Document.metadata_storage_path = System.Text.Encoding.UTF8.GetString(Convert.FromBase64String(result.Document.metadata_storage_path));
    allResults.Add(result.Document);
}

// 若总条数超过1000,循环获取后续分页
if (response.TotalCount > 1000)
{
    int skip = 1000;
    while (skip < response.TotalCount)
    {
        searchOptions.Skip = skip;
        var pageResponse = await _searchClient.SearchAsync<YourDocumentType>("your-query", searchOptions);
        
        await foreach (var result in pageResponse.GetResultsAsync())
        {
            result.Document.metadata_storage_path = System.Text.Encoding.UTF8.GetString(Convert.FromBase64String(result.Document.metadata_storage_path));
            allResults.Add(result.Document);
        }
        
        skip += 1000;
    }
}

// 将处理后的完整结果赋值给model
model.resultList = allResults;

2. 规避延迟加载陷阱

不要直接使用response.GetResults()的IEnumerable循环,改用异步枚举GetResultsAsync()并立即将结果存入内存列表,确保所有结果都被枚举并执行了解码逻辑。

3. 增加解码容错判断

避免因部分条目已解码导致的异常,添加Base64格式校验:

if (!string.IsNullOrEmpty(result.Document.metadata_storage_path) && IsBase64String(result.Document.metadata_storage_path))
{
    result.Document.metadata_storage_path = System.Text.Encoding.UTF8.GetString(Convert.FromBase64String(result.Document.metadata_storage_path));
}

// 辅助方法:判断字符串是否为Base64格式
private bool IsBase64String(string input)
{
    if (string.IsNullOrEmpty(input) || input.Length % 4 != 0)
        return false;
    try
    {
        Convert.FromBase64String(input);
        return true;
    }
    catch
    {
        return false;
    }
}

内容的提问来源于stack exchange,提问作者kintela

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 12:27:22