如何使用Java Graph API通过自定义Yes/No列搜索SharePoint文件?
可以实现,但你当前代码的问题出在两个关键点:
- 自定义列在Graph搜索查询中需要用托管属性名,而非你写的
STTagged(这可能是列的内部名或显示名) - SharePoint的Yes/No类型列在搜索查询里的取值是
1(代表Yes)或0(代表No),不是true/false
步骤1:确认自定义列的托管属性名
自定义列在SharePoint搜索架构中会对应一个托管属性,你需要先找到它的正确名称:
- 方法1:在SharePoint站点的列表设置中找到
Tagged列,查看其内部名称(比如内部名是STTagged),对应的托管属性通常是ows_{内部名},即ows_STTagged - 方法2:调用Graph API获取列信息:
在返回结果中找到// 示例:获取指定列表的所有列 ListColumnsCollectionPage columns = graphClient.sites(siteid).lists("your-list-id").columns() .buildRequest() .get();Tagged列的name字段(内部名),再对应到托管属性。
步骤2:修正查询字符串和代码
把查询字符串中的STTagged=false替换为正确的托管属性名+取值0(代表未标记),示例如下:
SiteRequestBuilder sitereq = graphClient.sites(siteid); String webUrl = sitereq.buildRequest().get().webUrl; // 修正后的带Tagged条件的查询字符串 String queryStringTagged = String.format("ows_STTagged=0 AND isDocument=true AND processed=false AND path: \"%s\" ", webUrl); LinkedList<SearchRequest> requestsList = new LinkedList<>(); SearchRequest requests = new SearchRequest(); LinkedList<EntityType> entityTypesList = new LinkedList<>(); entityTypesList.add(EntityType.DRIVE_ITEM); requests.entityTypes = entityTypesList; LinkedList<SortProperty> sortProperties = new LinkedList<>(); SortProperty sort = new SortProperty(); sort.name = "LastModifiedTime"; sort.isDescending = false; sortProperties.add(sort); SearchQuery query = new SearchQuery(); // 使用修正后的查询字符串 query.queryString = queryStringTagged; requests.query = query; requests.sortProperties = sortProperties; requests.size = 500; requestsList.add(requests); SearchEntityQueryParameterSet sqp = SearchEntityQueryParameterSet .newBuilder() .withRequests(requestsList) .build(); SearchEntityQueryCollectionRequest searchRequest = graphClient.search().query(sqp).buildRequest(); SearchEntityQueryCollectionPage searchResult = searchRequest.post();
额外注意事项
- 确保SharePoint搜索已经完成对该自定义列的爬取,如果是刚创建的列,可能需要等待爬取周期完成,或者手动触发爬取
- 如果
processed也是自定义列,同样需要用对应的托管属性名和正确取值格式
内容的提问来源于stack exchange,提问作者rread
相关产品推荐
相关产品推荐

