如何限制MS Search API仅返回前X条搜索结果?
如何限制Microsoft Graph Search API的返回结果数量
问题背景
需要限制Microsoft Graph Search API返回的DriveItem类型搜索结果数量,当前C#实现代码如下:
public async Task<string> Search() { var ApplicationClientID = Environment.GetEnvironmentVariable("CLIENT_ID"); var ApplicationClientSecret = Environment.GetEnvironmentVariable("CLIENT_SECRET"); var AzureTenantID = Environment.GetEnvironmentVariable("TENANT_ID"); string[] scopes = new[] { "https://graph.microsoft.com/.default" }; var options = new ClientSecretCredentialOptions { AuthorityHost = AzureAuthorityHosts.AzurePublicCloud, }; try { var clientSecretCredential = new ClientSecretCredential( AzureTenantID, ApplicationClientID, ApplicationClientSecret, options); var graphClient = new GraphServiceClient(clientSecretCredential, scopes, "https://graph.microsoft.com/v1.0"); Console.WriteLine($"searchQuery :{searchQuery}"); var requestBody = new Microsoft.Graph.Search.Query.QueryPostRequestBody { Requests = new List<SearchRequest> { new SearchRequest { EntityTypes = new List<EntityType?> { EntityType.DriveItem, }, Query = new SearchQuery { QueryString = this.searchQuery, }, Fields = new List<string> { "driveId", "listItemId", "author", "title", "url", "rank" }, QueryAlterationOptions = new SearchAlterationOptions { EnableSuggestion = true, EnableModification = true, } , Region ="US" }, }, }; var searchResults = await graphClient.Search.Query.PostAsync(requestBody).ConfigureAwait(false); var jsonResults = ExtractDriveItemDetails(searchResults); return jsonResults; } catch (Exception ex) { log.LogError(ex.Message); return null; } }
环境配置
使用MS Graph v1.0,项目引用如下:
<PackageReference Include="AutoMapper" Version="12.0.1" /> <PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="12.0.1" /> <PackageReference Include="Azure.Identity" Version="1.9.0" /> <PackageReference Include="Microsoft.Azure.Functions.Extensions" Version="1.1.0" /> <PackageReference Include="Microsoft.NET.Sdk.Functions" Version="4.1.1" /> <PackageReference Include="Microsoft.Azure.Services.AppAuthentication" Version="1.6.0" /> <PackageReference Include="Microsoft.Graph" Version="5.18.0" /> <PackageReference Include="Microsoft.Graph.Core" Version="3.0.9" /> <PackageReference Include="Microsoft.Identity.Client" Version="4.54.1" />
已尝试操作
尝试在SearchQuery中设置Top或Count属性,均未生效:
Query = new SearchQuery { QueryString = this.searchQuery, Top = 4 },
Query = new SearchQuery { QueryString = this.searchQuery, Count = 4 },
同时了解到EnableTopResults选项仅适用于消息类型的查询。
解决方案
正确的做法是在**SearchRequest对象**中设置Top属性,而非SearchQuery。SearchRequest的Top属性用于指定当前搜索请求返回的最大结果数,取值范围为1到1000。
修改后的SearchRequest代码如下:
new SearchRequest { EntityTypes = new List<EntityType?> { EntityType.DriveItem, }, Query = new SearchQuery { QueryString = this.searchQuery, }, // 添加Top属性限制结果数量 Top = 4, Fields = new List<string> { "driveId", "listItemId", "author", "title", "url", "rank" }, QueryAlterationOptions = new SearchAlterationOptions { EnableSuggestion = true, EnableModification = true, }, Region ="US" }
说明
SearchQuery中的Top参数并非用于控制返回结果总数,而是用于特定查询场景的内部分页,不适用于DriveItem类型的搜索结果限制。- 通过
SearchRequest.Top设置的数值将直接限制当前请求返回的最大结果条目数,符合需求。
内容的提问来源于stack exchange,提问作者dot
相关产品推荐
相关产品推荐

