You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 08:43:18