如何用正则表达式选择JSON分隔符,适配Azure认知搜索多层JSON索引
解决Azure认知搜索中多层JSON的键值对拆分问题
由于Azure认知搜索(ACS)仅支持内置工具处理JSON,要拆分包含嵌套结构(如数组、嵌套对象)的JSON为顶级键值对token,需使用支持嵌套结构识别的正则表达式,避免误拆分嵌套内部的逗号分隔符。
适用的正则分隔符
使用以下正则表达式作为索引器的拆分分隔符:
^\{\s*|\s*\}$|,\s*(?=(?:(?:[^"\\]|\\.)*")*(?:[^"\\]|\\.)*$)(?![^\[\{\]]*[\]\}])
正则逻辑解释
^\{\s*:匹配JSON开头的{及其后续空白字符,用于移除外层包裹的左大括号\s*\}$:匹配JSON结尾的}及其前面的空白字符,用于移除外层包裹的右大括号,\s*(?=(?:(?:[^"\\]|\\.)*")*(?:[^"\\]|\\.)*$):通过正向预查确保逗号不在引号包裹的字符串内,避免拆分带逗号的字符串值(?![^\[\{\]]*[\]\}]):通过负向预查确保逗号不在未闭合的[]或{}内部,忽略嵌套结构里的分隔符
配置与效果
将此正则配置到ACS索引器的字段拆分规则中,针对用户提供的样例JSON:
{ "CategoryName":"Desktop", "ProductDescription":"Computer", "ExternalManufacturerName":[ "Computer Maker A", "Computer Maker B" ], "Brand":"Computer Maker A" }
拆分后将得到预期的独立token:
[ "\"CategoryName\":\"Desktop\"", "\"ProductDescription\":\"Computer\"", "\"ExternalManufacturerName\":[\n \"Computer Maker A\",\n \"Computer Maker B\"\n ]", "\"Brand\":\"Computer Maker A\"" ]
注意事项
- ACS使用.NET正则引擎,完全支持上述预查语法,无需额外配置
- 若JSON包含更深层级的嵌套对象(如
{"key":{"subkey":"value"}}),该正则同样适用,会忽略嵌套对象内部的逗号
内容的提问来源于stack exchange,提问作者Fruity Medley
相关产品推荐
相关产品推荐

