前言
在调用SharePoint search query rest api时候,经常会碰到搜索中文、空格等特殊字符时候无结果的情况,如下为解决方案
解决方案
说明:如下是根据SitePath、DocumentLink、Path查找文档库中满足搜索条件的所有文件,由于文件夹中包含各种特殊字符、空格、中文等,所以需要做如下处理
1、把所有空格都转换为%20
2、将拼接好的字符串进行url编码
var searchSourceStr = "";
searchSourceStr += "sourceid='" + SPSearchSource_Enum.DepartmentFileSourceID + "'";
//必须加此项,否则会过滤到类似的数据
searchSourceStr += "&trimduplicates=false";
var queryTextStr = "";
var filterArray = new Array();
if (searchStr && searchStr.length > 0) {
var searchStrClean = AIUtility.AI.stringRemoveStrs(searchStr, ["'", "/", "#", "$", "&", "(", ")"]);
//filterArray.push("title:" + searchStrClean);
filterArray.push(searchStrClean);
}
debugger;
if (path && path.length > 0) {
var sitepath="SitePath:" + _spPageContextInfo.portalUrl.substring(0, _spPageContextInfo.portalUrl.length - 1) + path.replaceAll(' ','%20')+"*";
var documentLink="DocumentLink:" + _spPageContextInfo.portalUrl.substring(0, _spPageContextInfo.portalUrl.length - 1) + path.replaceAll(' ','%20')+"*";
var pathurl="Path:" + _spPageContextInfo.portalUrl.substring(0, _spPageContextInfo.portalUrl.length - 1) + path.replaceAll(' ','%20')+"*";
filterArray.push("("+encodeURIComponent(sitepath)+" OR "+encodeURIComponent(documentLink)+" OR "+encodeURIComponent(pathurl)+")");//escape转码,否则无数据
} else {
filterArray.push("SitePath:" + _spPageContextInfo.webAbsoluteUrl + "*");//escape转码,否则无数据
}
filterArray.push("ContentType<>Folder");
if (filterArray.length > 0) {
queryTextStr = "querytext='" + filterArray.filter(function (s) {
return s && s.trim();
}).join(" AND ") + "'";
}
var sortlist="sortlist='filename:ascending'";
var selectproperties = "selectproperties='Filename,Path,ParentLink,DocumentLink,SitePath,Size,FileType,UniqueID,LastModifiedTime,Created,createBy,SPWebUrl'";
var searchUrl = SPSearchAPIUrl + queryTextStr + "&" + selectproperties + "&"+ sortlist + "&" + searchSourceStr + "&startrow=" + (pageIndex - 1) * pageSize + "&rowlimit=" + pageSize;
console.log(searchUrl);
最终query url
说明:
1、ContentType<>Folder 内容类型排除文件夹,只保留文档
2、sortlist='filename:ascending' 根据文件名升序排序
3、sourceid='sharepoint search result source id' SharePoint 搜索结果源ID
4、trimduplicates=false 重要:设置是否包含类似的文件,如果设置为true,最终结果可能会比实际的少
5、&startrow=0&rowlimit=20 分页时候会用到
https://SharePoint Site Url/_api/search/query?
querytext='(
SitePath:https://SharePoint Web Url/Documents/测试文档/Tech%20World测试-2021.11.28*
OR DocumentLink:https://SharePoint Web Url/Documents/测试文档/Tech%20World测试-2021.11.28* OR Path:https://SharePoint Web Url/Documents/测试文档/Tech%20World测试-2021.11.28*)
AND ContentType<>Folder'
&selectproperties='Filename,Path,ParentLink,DocumentLink,SitePath,ContentType,Size,FileType,UniqueID,LastModifiedTime,Created,createBy,SPWebUrl'
&sortlist='filename:ascending'
&sourceid='sharepoint search result source id'
&trimduplicates=false
&startrow=0&rowlimit=20