Azure Search技能集无法使用contains运算符,求解决方案
解决办法
方案1:使用indexOf函数替代contains
Azure Cognitive Search的ConditionalSkill支持OData表达式中的indexOf函数,通过判断目标子字符串的索引是否大于等于0,即可实现“包含”的判断逻辑。修改后的ConditionalSkill配置如下:
{ "@odata.type": "#Microsoft.Skills.Util.ConditionalSkill", "name": "SetModeBasedOnPath", "description": "Sets mode based on metadata_spo_item_path", "context": "/document", "inputs": [ { "name": "condition", "source": "= indexOf($(/document/metadata_spo_item_path), '/Multimodel Doc/') >= 0" }, { "name": "whenTrue", "source": "= 'multimodel'" }, { "name": "whenFalse", "source": "= 'non-multimodel'" } ], "outputs": [ { "name": "output", "targetName": "mode" } ] }
原理:indexOf(string, substring)会返回子字符串在原字符串中的起始位置,若返回值≥0则说明原字符串包含该子字符串,返回-1则不包含。
方案2:拆分路径后检查片段(适合复杂层级判断)
如果需要更精准地匹配文件夹名称(而非路径片段),可以先通过SplitSkill将路径按斜杠分割为片段数组,再用ConditionalSkill判断数组中是否存在目标文件夹名:
第一步:添加SplitSkill拆分路径
{ "@odata.type": "#Microsoft.Skills.Text.SplitSkill", "name": "SplitPathSegments", "description": "Split SharePoint path into segments using slash as delimiter", "context": "/document", "inputs": [ { "name": "text", "source": "/document/metadata_spo_item_path" }, { "name": "delimiter", "source": "= '/'" } ], "outputs": [ { "name": "items", "targetName": "pathSegments" } ] }
第二步:修改ConditionalSkill判断数组元素
{ "@odata.type": "#Microsoft.Skills.Util.ConditionalSkill", "name": "SetModeBasedOnPathSegment", "description": "Sets mode based on path segments", "context": "/document", "inputs": [ { "name": "condition", "source": "= $(/document/pathSegments/any(segment: segment eq 'Multimodel Doc'))" }, { "name": "whenTrue", "source": "= 'multimodel'" }, { "name": "whenFalse", "source": "= 'non-multimodel'" } ], "outputs": [ { "name": "output", "targetName": "mode" } ] }
原理:SplitSkill将路径拆分为数组后,使用OData的any函数检查数组中是否存在等于"Multimodel Doc"的元素,以此判断文档是否位于目标文件夹下。
方案3:索引器字段映射直接处理(简化场景)
如果不需要在技能集中处理,也可以在索引器的字段映射中直接计算mode字段:
{ "fieldMappings": [ { "sourceFieldName": "metadata_spo_item_path", "targetFieldName": "mode", "mappingFunction": { "name": "conditional", "parameters": { "condition": "indexOf(source, '/Multimodel Doc/') >= 0", "whenTrue": "multimodel", "whenFalse": "non-multimodel" } } } ] }
这种方式无需额外添加技能集,适合逻辑简单的场景。
内容的提问来源于stack exchange,提问作者Mad Max
相关产品推荐
相关产品推荐

