AQL匹配含多斜杠路径无结果的原因咨询
Artifactory AQL路径匹配问题解析
问题场景
我在Artifactory中有如下文件记录:
{ "path": "amc-sw/pcm33/pcm21/system-pcm33-20221017104012.raucb", "type": "file" }
需求是匹配所有path中包含pcm21的记录。
执行以下AQL查询(通过JFrog CLI执行)能返回大量匹配记录:
查询spec文件内容:
{ "files": [ { "aql": { "items.find": { "repo": "amc-sw", "$and": [ { "$and": [ { "path": { "$match": "*pcm21/*" } } ] } ] } } } ] }
执行命令:
jf rt search --spec query.json --url=$ARTIFACTORY_URL --user=$ARTIFACTORY_USER --access-token=$ARTIFACTORY_PASS
当匹配条件改为"$match": "*/pcm21*"时同样能返回大量记录,但改为"$match": "*/pcm21/*"时返回0条记录,请问为何无法使用双斜杠进行匹配?
原因分析
1. Artifactory AQL中path字段的实际含义
首先要明确:Artifactory AQL里的path字段,指的是文件所在的目录路径(不包含仓库名,也不包含文件名)。比如你示例中的文件,完整仓库路径是amc-sw/pcm33/pcm21/system-pcm33-20221017104012.raucb,对应AQL字段:
repo:amc-sw(仓库名)path:pcm33/pcm21(文件所在目录)name:system-pcm33-20221017104012.raucb(文件名)
你的示例记录里把完整路径写进了path字段,这是对AQL字段的误解,但不影响核心问题的分析。
2. 通配符匹配的规则差异
AQL的$match使用shell风格的通配符匹配,三种模式的逻辑如下:
"$match": "*pcm21/*":匹配任意位置包含pcm21/子串的路径,比如pcm33/pcm21/subdir、abc/pcm21/def这类路径都会被命中(只要pcm21后面跟着斜杠,即存在子目录)。"$match": "*/pcm21*":匹配任意位置包含/pcm21子串的路径,不管pcm21是不是最后一级目录——比如pcm33/pcm21(最后一级目录)、pcm33/pcm21/subdir(中间目录)都会被命中。"$match": "*/pcm21/*":要求路径中存在完整的/pcm21/子串,意味着pcm21必须是一个中间目录,前后都有斜杠,且后面必须还有子目录。而你的目标文件所在目录是pcm33/pcm21,pcm21是最后一级目录,路径中只有/pcm21(结尾),没有/pcm21/这个子串,因此无法被匹配。
简单来说,*/pcm21/*强制要求pcm21目录下还有子目录,而你的目标文件直接放在pcm21目录下,自然匹配不到。
内容的提问来源于stack exchange,提问作者Kjeld Flarup
相关产品推荐
相关产品推荐

