使用Microsoft Graph API搜索本地索引数据时URL路径过滤问题
问题描述
我正尝试搜索由本地Microsoft Graph Connector索引的数据,已有大量文件完成索引且在部分搜索中可见,但使用“URL”属性筛选特定文件夹下的数据时始终无法得到结果。
使用的查询语句如下:
search_query = { "requests": [ { "entityTypes": [ "microsoft.graph.externalItem" ], "contentSources": [ f"/external/connections/{self.connection_id}" ], "query": { "queryString": value, "queryTemplate": '{searchTerms} url:\"O:\\_Some&Folder\\ClientName\\Projects\\Area\\ProjectName*\"' }, "fields": [ "title", "fileName", "fileExtension", "url", "fileWebLink", "ParentLink", "path", "modifiedBy", "fileID", "documentId"], "from": 0, "size": 25, } ] }
请求发送至端点:https://graph.microsoft.com/v1.0/search/query
最终目标是仅返回本地文件系统中特定路径下的文件夹数据。尝试多种查询方式后,推测问题与索引的内部分词(tokenization)机制有关,但尚未找到解决办法。
理想情况下希望使用类似(URL: "path*" OR URL:"path*")的KQL语法,但目前发现仅当指定Projects文件夹两侧的部分路径(如O:\\_Some&Folder\\ClientName\\或Area\\ProjectName*\\)时,查询才会返回结果。另外,当URL属性不包裹引号时,路径会被拆分为多个小分词,虽能得到结果,但需要指定多个不同项目路径,这种方式会导致同名项目返回错误结果。
请问如何解决分词问题以实现完整URL过滤?或者该功能是否可行?
解决方案
1. 检查URL字段的索引配置
Microsoft Graph Connector对外部字段的分词规则由索引属性定义。默认情况下,url字段可能被配置为可分词的文本字段,导致路径中的特殊字符(如&、\\)被当作分隔符拆分:
- 登录Microsoft 365管理中心,进入Microsoft Search > 连接器,找到你的本地文件连接器。
- 查看字段映射,确认
url字段的索引类型:如果是String类型且勾选了可搜索,会触发分词;需要改为不可搜索但可筛选的String类型,或使用Edm.String类型并设置filterable=true、searchable=false(自定义字段映射时)。
2. 使用path字段替代url筛选
从查询字段列表看,已包含path字段。本地文件连接器通常会将文件的本地路径映射到path字段,该字段的分词规则更适合路径匹配:
- 修改
queryTemplate为:'{searchTerms} path:\"O:\\_Some&Folder\\ClientName\\Projects\\Area\\ProjectName*\"' - 若
path字段仍存在分词问题,尝试用通配符覆盖分词节点,将路径拆分为多个部分用*连接:'{searchTerms} path:\"O:*_Some&Folder*ClientName*Projects*Area*ProjectName*\"'
3. 利用KQL的startswith或eq运算符(需字段支持)
如果url或path字段被配置为可筛选的精确匹配字段,可使用KQL运算符实现精确前缀匹配:
- 修改查询模板为:
注意:该方式要求字段必须支持'{searchTerms} url:startswith("O:\\_Some&Folder\\ClientName\\Projects\\Area\\ProjectName")'startswith运算符,即索引配置中filterable设为true。
4. 自定义字段映射
若默认字段无法满足需求,可在连接器配置中添加自定义字段,将完整路径存储为不可分词的筛选字段:
- 在连接器的字段映射步骤,添加新字段(如
fullPath),映射到本地文件的完整路径。 - 设置该字段的索引属性为
filterable=true、searchable=false,确保路径作为整体存储,不被分词。 - 查询时使用
fullPath:\"O:\\_Some&Folder\\ClientName\\Projects\\Area\\ProjectName*\"进行筛选。
5. 多路径筛选的优化
若需同时匹配多个项目路径,使用KQL的OR运算符组合多个筛选条件,确保每个路径都使用正确的引号和通配符:
'{searchTerms} (path:\"O:\\_Some&Folder\\ClientName\\Projects\\Area\\Project1*\" OR path:\"O:\\_Some&Folder\\ClientName\\Projects\\Area\\Project2*\")'
内容的提问来源于stack exchange,提问作者Jakub Sowa

