云客户?
免费开始>
在MyJFrog >中升级
云有什么新>





概述

人工查询语言(AQL)是专门为让您发现与Artifactory中存储的工件和构建相关的任何数据而设计的。它的语法提供了一种简单的方法来制定复杂的查询,这些查询指定任意数量的搜索条件、过滤器、排序选项和输出参数。AQL作为RESTful API公开,它使用数据流提供输出数据,从而实现极快的响应时间和低内存消耗。AQL只能提取驻留在Artifactory实例中的数据,因此它继续运行局部存储库远程存储库缓存而且虚拟存储库

从Artifactory 7.17.4,你可以搜索远程存储库

下面是一些简单的例子:

//返回"artifactory"构建的所有工件。items.find({"@build.name":{"$eq":"artifactory"}}) //返回所有依赖于非Apache许可证的构建。builds.find({"module.dependency.item.@license":{"$nmatch":"Apache-*"}}) //返回包含"org/artifactory/Main.class"文件的所有存档文件。items.find({“archive.entry.name”:{" $ eq”:“Main.class”},“archive.entry.path”:{" $ eq”:“org/artifactory}})

下面是一个稍微复杂一点的例子。

//返回任何名为“Artifactory.jar”的存档文件的所有条目,来自任何名为“Artifactory”的构建,//构建号为521。archive.entries。找到( { "archive.item.name":{"$eq":"Artifactory.jar"}, "archive.item.artifact.module.build.name":{"$eq":"Artifactory"}, "archive.item.artifact.module.build.number":{"$eq":"521"} })

页面内容



下面是另一个示例,它展示了AQL从存储库中挖掘信息的全部能力,这是其他工具无法比拟的。

//比较2个“maven+example”构建项中的工件内容。找到( { "name":{"$match":"multi2*.jar"}, "$or":[ { "$and":[ {"artifact.module.build.name":{"$eq":"maven+example"}}, {"artifact.module.build.number":{"$eq":"317"}} ] }, { "$and":[ {"artifact.module.build.name":{"$eq":"maven+example"}}, {"artifact.module.build.number":{"$eq":"318"}} ] } ] }).include("archive.entry")
查询输出
[{{“结果”:“回购”:“ext-snapshot-local”、“路径”:“org/jfrog/test/multi2/3.0.0-SNAPSHOT”、“名称”:“multi2——3.0.0 - 20151012.205507 - 1. - jar”、“类型”:“文件”、“大小”:1015年,“创建”:“2015 - 10 - 12 - t22:55:23.022 + 02:00”、“created_by”:“admin”,“修改”:“2015 - 10 - 12 - t22:55:23.013 + 02:00”、“modified_by”:“admin”,“更新”:“2015 - 10 - 12 - t22:55:23.013 + 02:00”,“档案”:[{“条目”:[{“entry.name”:“App.class”、”条目。{"entry.name": "MANIFEST. path": "artifactory/test"}, {"entry.name": "MANIFEST. path": "artifactory/test"}曼氏金融”、“条目。路径" : "META-INF" } ] } ] },{ "repo" : "ext-snapshot-local", "path" : "org/jfrog/test/multi2/3.0.0-SNAPSHOT", "name" : "multi2-3.0.0-20151013.074226-2.jar", "type" : "file", "size" : 1015, "created" : "2015-10-13T09:42:39.389+02:00", "created_by" : "admin", "modified" : "2015-10-13T09:42:39.383+02:00", "modified_by" : "admin", "updated" : "2015-10-13T09:42:39.383+02:00", "archives" : [ { "entries" : [ { "entry.name" : "App.class", "entry.path" : "artifactory/test" }, { "entry.name" : "MANIFEST.MF", "entry.path" : "META-INF" } ] } ] } ], "range" : { "start_pos" : 0, "end_pos" : 2, "total" : 2 } }


体系结构

AQL构造为一组相互连接的域,如下图所示。一次只能在一个域上运行查询,这称为主要的查询的域。

目前支持以下主域:构建,条目,促销活动而且释放。例如,你的查询可能是这样的:items.find(…),builds.find(…)Archive.entries.find(…),build.promotions.find(…)或releases.find(…)

您可以使用来自其他域的字段作为搜索条件的一部分,或者指定要在输出中显示的字段,但在这种情况下,您需要遵循中描述的约定使用字段

支持域

AQL是在Artifactory V3.5.0中引入的,支持作为一个主域财产,以及统计作为次要域。Artifactory的后期版本引入了可以包含在查询中的其他域。下表总结了每个域可访问的版本。


3.5.0 4.2.0 4.7.0 0 / 7.0.0

(勾选)

(勾选) (勾选) (勾选)
项。财产

(勾选)

(勾选) (勾选) (勾选)
统计
(勾选) (勾选) (勾选) (勾选)
存档
(错误) (勾选) (勾选) (勾选)
档案。条目
(错误) (勾选) (勾选) (勾选)
工件
(错误) (勾选) (勾选) (勾选)
依赖
(错误) (勾选) (勾选) (勾选)
模块
(错误) (勾选) (勾选) (勾选)
模块。财产
(错误) (勾选) (勾选) (勾选)
构建
(错误) (勾选) (勾选) (勾选)
构建。财产
(错误) (勾选) (勾选) (勾选)
促销活动
(错误) (错误) (勾选) (勾选)
释放
(错误) (错误) (错误) (勾选)
Release_artifact
(错误) (错误) (错误) (勾选)



使用

语法

来自Artifactory 7.37。x, AQL查询支持禁用唯一结果。这可以用来加快查询速度或“按原样”获得结果。这个替换了之前的基于文本的AQL查询的搜索结果,默认情况下是唯一的(本地SQL选择包含“不同的”术语)。

例如:

//在artifactory items中找到所有唯一的jar名称。查找({"name": {"$match":"*.jar"}})。包括("name") // Find all jars's names in artifactory includes repeated values across different repositories. items.find({"name" : {"$match":"*.jar"}}).include("name").distinct(false)




//在名为"my_local"的存储库中找到所有jar项。//属性"path"在单个存储库中已经是唯一的,并且由于性能原因可以禁用唯一的结果。items.find ({"repo" : "my_local"}, {"name" : {"$match":"*.jar"}} ) .include("path") .distinct(false)
< domain_query >;(<标准>)其中包括(<字段>).sort (< order_and_fields >) .offset (< offset_records >) .limit (< num_records >) .distinct(<真|假>)

地点:

domain_query
与主域对应的查询。肯定是其中之一项目构建条目
标准
有效JSON格式的搜索条件
字段
(可选)查询输出有一个默认的字段集。这个参数可以让您指定一组不同的字段这应该包括在输出中
order_and_fields
(可选)应该对输出进行排序的字段和排序顺序。为每个域定义了一组默认的字段和排序顺序。
num_records
(可选)应该提取的记录的最大数量。如果省略,将提取所有符合查询条件的记录。
抵消
(可选)显示结果的第一条记录的偏移量(即应该跳过多少个结果来显示)
截然不同的

(可选)禁用或启用唯一查询结果。通过默认的

限制

排序限制而且抵消元素仅在以下情况下有效:

  • 您的查询没有包括元素
  • 如果你有包括元素,则只指定其中主域的字段。

例如,在下面的查询中,排序限制而且抵消不会工作,因为主域是,但包括元素属性中的字段工件模块而且构建域应该显示:

items.find()其中包括(“工件”、“artifact.module”,“artifact.module.build”)

使用字段

主域中的任何字段都可以在查询中的任何地方直接使用。如果使用来自其他域的字段,则必须使用来自主域的完整关系路径指定这些字段。

例如,要找到一个名为“myrepo”的存储库中的所有项,您将使用:

items.find ({"repo": "myrepo"})


但是要找到名为“mymodule”的模块创建的所有项,您将使用:

Items.find ({"artifact.module.name": "mymodule"})


并且由于您还可以从构建域,以查找生成名为“artifactory”的项的所有构建。War ",你也可以用:

builds.find({“module.artifact.item.name”:“artifactory.war”})

执行

要执行AQL查询,请使用Artifactory查询语言REST API


实体和字段

你可以发出找到根据语法并配置您的请求以显示来自任何域的字段。

字段名 类型 描述
回购 字符串 存储该项的存储库的名称
路径 字符串

与此项关联的完整路径

文件夹的路径不应该包含“/*”,而对于项目,它是必需的。

的名字 字符串 项目的名称
创建 日期 当项被创建时
修改 日期 文件系统时间戳,指示该项最后修改的时间
更新 日期 当项最后上传到存储库时。
created_by 字符串 项目所有者的名称
modified_by 字符串 修改该项的最后一个用户的名称
类型 枚举

项目类型(文件/文件夹/任何)。

如果类型查询中未指定,则搜索的默认类型为文件

深度 int 项目在根文件夹路径中的深度
original_md5 字符串 该项最初上传时的md5哈希码
actual_md5 字符串 该项的当前md5哈希码
original_sha1 字符串 该项最初上传时的sha1哈希码
actual_sha1 字符串 该项的当前sha1哈希码
sha256 字符串

项目的sha256哈希码

Artifactory 5.5版本支持SHA-256

您只能在已经部署到Artifactory 5.5或更高版本的工件上执行AQL搜索迁移数据库如在sha - 256支持将Artifactory升级到5.5及以上版本后。

大小 项目在磁盘上的大小
virtual_repos 字符串 包含存储该项的存储库的虚拟存储库。



存档

存档域当前不包含字段


启用其他存档类型

要启用对特定存档类型的搜索,应该在mimetypes.xml文件中为此存档类型指定' index=true '。看到# ContentType / MIMEType配置文件

条目 的名字 字符串 条目的名称
路径 字符串 存储库中条目的路径



促销活动





创建 日期 当构建被推广时
created_by 字符串 促进构建的Artifactory用户
状态 字符串 晋升的状态
回购 字符串 将构建提升到的存储库的名称
评论 字符串 关于促销的免费文本评论
用户 字符串 提升构建的CI服务器用户



构建 url 字符串 构建的URL
的名字 字符串 构建名称
数量 字符串 版本号
创建 日期 文件系统时间戳,指示该项最后修改的时间
created_by 字符串 创建构建的用户的名称
修改 日期 文件系统时间戳,指示上次修改构建的时间
modified_by 字符串 修改构建的最后一个用户的名称
开始 日期

构建开始时间。该字段的值直接从相关的构建build-info.json文件。
该字段是不可变的,并且不会在构建升级或构建复制时更改。




财产 关键 字符串 属性键
价值 字符串 属性值



统计
下载 日期 最后一次下载项目的时间
下载 int 某项的下载总数
downloaded_by 字符串 下载此项目的最后一个用户的名称
remote_downloads int 从智能远程存储库代理项所在的本地存储库的项的下载总数
remote_downloaded 日期 上一次从智能远程存储库(代理该项所在的本地存储库)下载项的时间
remote_downloaded_by 字符串 从智能远程存储库(代理该项所在的本地存储库)下载该项的最后一个用户的名称
remote_origin 字符串 来自下载请求的智能远程代理链的远程Artifactory实例的地址。
remote_path 字符串 智能远程代理链上的完整路径,下载请求通过该路径从源实例传递到当前实例。



工件 的名字 字符串 工件的名称
类型 字符串 工件的类型
sha1 字符串 工件的SHA1哈希代码
md5 字符串 工件的MD5哈希码



模块 的名字 字符串 模块的名称
依赖 的名字 字符串 依赖项的名称
范围 字符串 依赖项的范围
类型 字符串 依赖项的类型
sha1 字符串 依赖项的SHA1哈希代码
md5 字符串 依赖项的MD5哈希码
释放 的名字 字符串 发布包的名称
版本 字符串 发布包的版本
状态 字符串 发布包的状态
创建 字符串 创建发布包的日期
签名 字符串 发布包签名
release_artifact 路径 字符串 发布工件完整的回收路径



建立查册条件

标准element必须是一个有效的JSON格式语句,由指定应该返回的项的条件组成。它本质上是一个复合布尔语句,只有语句求值的元素真正的由查询返回。

每个标准本质上都是应用于字段或属性的比较语句。请参阅完整的清单比较运算符.虽然每个标准都可以用完整的通用格式表示,但AQL为了可读性定义了缩写形式如下所述。

领域的标准

在字段上指定标准的一般方法如下:

{" <字段> ":{" <比较运算符>”:“< >价值"}}

如果查询应用于不同的域,则字段名必须在主域的关系路径前挂起。

例如:

//查找name字段与表达式"*test. "匹配的项目。*”项目。找到({"name": {"$match" : "*test.*"}}) //Find items that have been downloaded over 5 times. //We need to include the "stat" specifier in "stat.downloads" since downloads is a field of the stat domain and not of the item domain. items.find({"stat.downloads":{"$gt":"5"}}) //Find items that have never been downloaded. Note that when specifying zero downloads we use "null" instead of 0. //We need to include the "stat" specifier in "stat.downloads" since downloads is a field of the stat domain and not of the item domain. items.find({"stat.downloads":{"$eq":null}}) //Find builds that use a dependency that is a snapshot builds.find({"module.dependency.item.name":{"$match":"*SNAPSHOT*"}})

在统计域中值为“0”的字段

注意,当在统计域中搜索值为“0”的项时,应该搜索null,而不是0。例如,如上所示,当搜索下载为零的项目时,指定“null”而不是0。

字段条件的简短符号

AQL支持字段搜索条件的简短符号。

字段上的"equals" ("$eq")标准可以如下所示:

{"<字段>":"<值>"}

例子
查找“name”字段等于“ant-1.9.4.jar”的项目
常规的符号

items.find ({" name ": {" $ eq”:“ant-1.9.4.jar}})

短的符号

items.find({“名称”:“ant-1.9.4.jar”})

性能标准

Artifactory允许你在三个域中附加和搜索属性:项目模块而且构建。

在属性上指定标准的一般方法如下:

{" @ < property_key > ":{“操作符”:“< property_value > "}}

访问正确的属性

如果您从查询的主要域指定属性,您可以像上面描述的那样简单地输入属性键和值。如果指定来自其他域中的属性,则需要指定属性的完整关系路径。

在下面的示例中,主域是构建域中的属性,但我们希望查找基于域,所以我们必须指定属性的完整路径:

builds.find module.artifact.item({”。@qa_approved": {"$ne": "true"}})

下面是一些例子:

//找到已被QA批准的项目。找到({"@qa_approved" : {"$eq" : "true"}}) //Find builds that were run on a linux machine" builds.find({"@os" : {"$match" : "linux*"}}) //Find items that were created in a build that was run on a linux machine. items.find({"artifact.module.build.@os" : {"$match" : "linux*"}})

属性标准的简短符号

AQL支持用于属性搜索条件的简短符号。

属性上的"equals" ("$eq")标准可以如下所示:

{"@": ""}

例子

查找具有名称为“license”且值等于“GPL”的相关属性的项

常规的符号

items.find @artifactory({”。许可证":{"$eq": "GPL"}})

短的符号
items.find @artifactory({”。“GPL”})

复合标准

字段和属性上的搜索条件可以嵌套并组合成使用“美元和或者美元或“运营商。如果未指定操作符,则默认为美元和

<标准> ={<美元”和“|”美元或“>:[{<标准>},{<标准>}]

标准可以嵌套到任何程度

请注意,由于搜索条件可以嵌套到任何程度,您可以构造具有所需的任何复杂程度的逻辑搜索条件。

下面是一些例子:

//这个例子显示了一个隐式的"$and"操作符(因为这是默认的,所以你不必显式地指定它,而是用逗号分隔标准)和一个显式的"$or"操作符。//查找jcenter或my-local存储库中的所有文件项。items.find ({"type" : "file","$or":[{"repo" : "jcenter", "repo" : "my-local" }]}) //Find all the items that were created in a build called "my_debian_build" and whose name ends with ".deb" or all items created in a build called "my_yum_build" and whose name ends with ".rpm". items.find( { "$or": [ { "$and": [ {"artifact.module.build.name" : "my_debian_build"} , {"name" : {"$match" : "*.deb"}} ] }, { "$and": [ {"artifact.module.build.name" : "my_yum_build"} , {"name" : {"$match" : "*.rpm"}} ] } ] } ) //Find all items in a repository called "my_local" that have a property with a key called "license" and value that is any variant of "LGPL". items.find({"repo" : "my_local"},{"@artifactory.licenses" : {"$match" : "*LGPL*"}})

单个物业的匹配准则($msp)

在属性上指定多个条件的搜索有时可能会产生意想不到的结果。

这是因为项目经常使用多个属性进行注释,只要任何属性的任何条件为真,项目将以常规方式返回找到

但有时,我们需要找到其中单个特定属性符合多个标准的项目。为此,我们使用$msp(单个物业匹配)操作符。

根本区别是有规律的找到并且使用msp美元操作符:

  • 找到将返回一个项目如果任何它的性质所有搜索词中的条件。
  • msp美元只会返回一个项目,如果至少一个属性的答案所有的标准msp美元术语。

这里有一个例子。

考虑两项A和B。

A有一个有值的许可证属性AGPL-V3

B有两个许可证属性。一个是lgpl - 2.1,另一个lgpl - 2.2

具有属性的项

现在让我们假设我们想要找到使用各种GPL许可证的项目,只要不是LGPL-2.1。

在我们的例子中,我们希望两者都能得到一个项目和B返回自一个AGPL-V3而且Blgpl - 2.2

首先,我们可以这样写我们的查询:

items.find ({ "@license":{"$match": "*GPL*"}, "@license":{"$nmatch": "LGPL-2.1*"} })

但是这个查询只返回项目一个

返回A项,因为它清楚地回答了两个条件:"@license":{"$match": "*GPL*"}和"@license":{"$nmatch": "LGPL-2.1*"}

B项不返回,因为它的属性license=LGPL-2.1不满足“@license”:{“$ .nmatch”:“lgpl - 2.1 *”}。

如果我们使用msp美元操作人员如下:

”项。找到({ "$msp": [ "@license":{"$match": "*GPL*"}, "@license":{"$nmatch": "LGPL-2.1*"} ]}).

那么两个项目一个B项返回。

返回A项,因为它具有@license属性AGPL-V3符合这两个{" @license ":{" $匹配”:“* GPL *}}准则和“@license”:{" $ nmatch”:“lgpl - 2.1 *”}标准。

返回项B,因为它具有@license属性lgpl - 2.2这也符合这两个{" @license ":{" $匹配”:“* GPL *}}准则和“@license”:{" $ nmatch”:“lgpl - 2.1 *”}标准。

注意msp美元Operator在所有具有属性的域上都同样有效:模块而且构建

比较运算符

下表列出了允许的全部比较操作符集:

操作符 类型 意义
美元不 字符串,日期,int,长 不等于
美元的情商 字符串,日期,int,长 =
$ gt 字符串,日期,int,长 大于
一种美元 字符串,日期,int,长 大于或等于
$ lt 字符串,日期,int,长 不到
$ lte 字符串,日期,int,长 小于或等于
$匹配 字符串 匹配
nmatch美元 字符串 不匹配

基于时间的操作,请参见相对时间算子

使用通配符

为了启用使用非特定条件的搜索,AQL在常用搜索函数中支持通配符。

使用通配符$匹配而且nmatch美元

当使用“$匹配“而且”nmatch美元操作符,“*”通配符替换任何字符串,“?”通配符替换单个字符。

属性上的“全部捕获”符号

除了支持"$匹配“而且”nmatch美元, AQL支持使用通配符进行匹配的表示法任何键或任何属性值。

如果指定“@*”作为属性键,那么它意味着匹配任何键。

如果你指定"“作为属性值,那么它意味着匹配任何值

例子

查找具有“GPL”值的任何属性的项目

常规的符号

items.find ({"$and" : [{"property.key" : {"$eq" : "*"}}, {"property.value" : {"$eq" : "GPL"}}]})

短的符号

items.find({“@ *”:“GPL”})

例子

找到键为“许可证”的属性标注的任何项(即找到带有“许可证”属性的任何项)

常规的符号

items.find ({"$and" : [{"property.key" : {"$eq" : "license"}}, {"property.value" : {"$eq" : "*"}}]})

短的符号
items.find({“@artifactory.licenses”:“*”})

小心不要滥用通配符卡

在不符合上述规则的查询中使用的通配符(“*”和“?”)将被解释为字面量。

例子

为了避免混淆,这里有一些使用“*”和“?”字符的例子,解释了为什么它们被解释为通配符或字面量。

查询 通配符或文字 解释 查询返回什么
items.find ({" name ":{" $匹配”:“ant-1.9.4 *”。}}) 通配符

属性允许字段上的通配符$匹配操作符。

所有名称与表达式“ant-1.9.4.*”匹配的项目
items.find ({" name ": {" $ eq”:“ant-1.9.4 *”。}}) 文字

字段上的通配符只允许使用$匹配而且nmatch美元操作符。

只找到名称字面上是“ant-1.9.4.*”的项目。

items.find({“@artifactory.licenses”:“*”})

通配符

对于属性,允许使用这种简短的符号,可以表示任何值

属性键为“license”的所有项

items.find({“@artifactory.licenses”:“* GPL”})

文字

这是替换属性的$eq操作符的简短符号,但它没有对属性使用“捕捉全部”符号。

所有授权值为“*GPL”的项目

items.find ({“@artifactory.licenses”:{" $匹配”:“* GPL * "}}

通配符 属性上的通配符是允许的$匹配操作符。 所有带有许可证的项目都匹配表达式“*GPL*”

日期和时间格式

AQL支持日期和时间格式W3C概要的ISO 8601日期和时间格式标准。

完整的日期和时间符号被指定为:

YYYY-MM-DDThh: mm: ss。年代TZD (e.g., 2012-07-16T19:20:30.45+01:00)

也支持部分精度指定的日期/时间:(例如,只指定年份,或年和月,年,月和日等。)

例如,下面的查询将返回2012年7月16日(GMT+1时区)晚上7:20后30.45秒后修改的所有项:

//找到所有在2012-07-16T19:20:30.45+01:00之后修改过的条目。找到({"modified" : {"$gt" : "2012-07-16T19:20:30.45+01:00"}}) //Find all the builds that have were created after 2012-07-01 builds.find({"created" : {"$gt" : "2012-07-01"}})

详情请参阅W3C文档

相对时间算子

AQL支持使用相对时间为查询指定时间间隔。换句话说,查询的时间间隔将始终相对于查询运行的时间,因此您不必在每次查询运行时都以某种其他方式更改或制定时间段。例如,您可能希望运行前一天或两周前的时间段的查询。

使用以下两个运算符指定相对时间:

美元之前
查询在整个时间段内运行,直到指定的时间。
去年美元
从指定的时间开始运行查询,直到运行查询为止

时间段由数字和以下后缀之一指定:

毫秒
米尔斯女士
第二个年代,年代
分钟
分钟
d
w
个月
个月
y

例如,要指定五天,您可以使用5 d.要指定两个星期,您可以使用2 w

下面是一些使用相对时间运算符的例子:

//查找最近三天内修改过的所有项。找到({"modified" : {"$last" : "3d"}}) //Find all the builds that were created up to two weeks ago (i.e. no later than two weeks ago) builds.find({"created" : {"$before" : "2w"}})

指定输出字段

每个查询在结果集中显示一组默认字段,但是您可以完全控制这一点,并且可以使用可选选项指定要显示哪些字段包括元素。

您甚至可以指定显示来自与结果集相关的其他实体的字段。

显示所有字段

使用:其中包括(“*”)

例如:

//查找所有条目,并显示所有条目字段items. Find ().include("*")

显示特定字段

每个查询在输出中显示一组默认字段。使用其中包括元素,您可以覆盖此默认设置并指定希望在输出中接收的任何特定字段集。

使用:包括(“< field1 >”、“< field2 >”……)

例如:

//查找所有项目,只显示"name"和"repo"字段items. Find()。包括(“名字”,“回购”)

还可以显示与查询返回的字段相关联的其他实体的特定字段。

属性中的任何字段域,那么这将覆盖默认输出设置,并且只有将显示您明确指定的字段。

属性中的字段财产统计域的默认字段,则输出将显示属性中明确指定的其他字段财产统计域。

例如:

//找到所有项目,并从对应的“stat”实体items. Find()显示“name”和“repo”字段以及“downloads”的数量。包括("name", "repo", "stat.downloads") //Find all items, and display the default item fields fields as well as the stat fields items.find().include("stat") //Find all items, and display the default item fields as well as the stat and the property fields items.find().include("stat", "property") //Find all items, and display the "name" and "repo" fields as well as the stat fields items.find().include("name", "repo", "stat") //Find all builds that generated items with an Apache license, and display the build fields as well as the item "name" fields. Click below to view the output of this query builds.find({ "module.artifact.item.@license":{"$match":"Apache*"} } ).include("module.artifact.item.name")

注意,输出显示了“build”域的默认字段,以及项目域的“name”字段。来自模块和工件域的字段不会显示,因为它们没有在include元素中指定。

查询输出
{"results":[{"构建。创建" : "2015-09-06T15:49:01.156+03:00", "build.created_by" : "admin", "build.name" : "maven+example", "build.number" : "313", "build.url" : "http://localhost:9595/jenkins/job/maven+example/313/", "modules" : [ { "artifacts" : [ { "items" : [ { "name" : "multi-3.0.0-20150906.124843-1.pom" } ] } ] } ] },{ "build.created" : "2015-09-06T15:54:40.726+03:00", "build.created_by" : "admin", "build.name" : "maven+example", "build.number" : "314", "build.url" : "http://localhost:9595/jenkins/job/maven+example/314/", "modules" : [ { "artifacts" : [ { "items" : [ { "name" : "multi-3.0.0-20150906.124843-1.pom" } ] } ] } ] } ], "range" : { "start_pos" : 0, "end_pos" : 2, "total" : 2 } }

没有管理权限的用户

为确保非特权用户在没有权限的情况下无法访问信息,对没有管理员权限的用户进行了如下限制:

  1. 查询中的主域只能为项。
  2. 属性中必须包含以下三个字段包括指令:名字,回购,路径

但是请注意,一旦满足了这些限制,您就可以在中包含来自任何域的任何其他可访问字段包括指令。

按键过滤属性

如上所述,.include元素的主要用途是指定要在结果集中显示的输出字段。

这个概念以类似的方式应用于属性。每个项目都可以用几个(甚至很多)属性进行注释。在许多情况下,您可能只对属性的特定子集感兴趣,并且只想显示它们。

因此,萤火虫e元素可以用来过滤掉结果中不需要的属性,并且只显示(即。包括你感兴趣的。

例如,显示注释所找到的项的所有属性。

//查找所有项目,并显示"name"和"repo"字段,以及与每个项目items. Find()相关的所有属性。Include ("name", "repo", "property.*")

然而,如果你只对一个特定的属性感兴趣(例如,你只是想知道返回的每个项的版本),你可以过滤掉所有其他属性,只包含你感兴趣的键的属性:

//查找所有条目,并显示“name”和“repo”字段,以及每个条目items. Find()的“version”属性的键和值。Include ("name", "repo", "@version")

排序

AQL实现了默认排序顺序,但是,您可以使用输出中的字段重写默认排序顺序并指定任何其他排序顺序.sort元素添加到查询的末尾,如下所示:

.sort ({< asc | desc >美元":[< field1 >, < field2 >》……]})

只能对输出中显示的字段指定排序(无论它们是默认显示的字段还是由于其中包括元素)。

下面是一些例子:

//找到artifactory中所有的罐子,并按repo和name项目进行排序。查找({"name": {"$match":"*.jar"}})。排序({"$asc": ["repo","name"]})// Find all the jars in artifactory and their properties, then sort them by repo and name items.find({"name" : {"$match":"*.jar"}}).include("@").sort({"$asc" : ["repo","name"]})

显示限制和分页

限制

注意重要的限制排序,限制而且抵消上面描述的

使用.limit元素时,您可以限制查询将显示的记录数量。

//找到artifactory中的所有jar,并按repo和name对它们进行排序,但只显示前100个结果项。查找({"name": {"$match":"*.jar"})。排序({"$asc": ["repo","name"]}).limit(100)


方法,当您希望集中于结果的子集时,也可以实现分页.offset元素。

//运行相同的示例,但这次显示最多50个项目,但跳过前100个项目。查找({"name": {"$match":"*.jar"})。排序({"$asc": ["repo","name"]}).offset(100).limit(50)

使用远程存储库

搜索远程存储库

从Artifactory版本7.17.4开始,您可以直接在远程或虚拟存储库中进行搜索。这需要在Advanced选项卡下的远程存储库配置上向远程Artifactory提供凭据。

要启用远程存储库中的搜索,可以使用dd的传递标记到搜索查询。

items.find (“repo”: “remote-repo”).transitive()

规则及指引

以下规则和指导原则适用于搜索远程存储库和虚拟存储库:

  • 远程存储库必须是一个Artifactory实例。

  • 查询必须包含一个存储库和一个美元的情商条款。

    例子
    items.find (“repo”: “remote-repo”).transitive()
  • 你不能使用排序而且抵消标志在AQL查询。

  • 主域只能包含项目

  • 包括只能有以下域名:项目而且ItemProperties。

  • 搜索将在虚拟存储库中的前五个远程存储库上运行。

搜索的例子

例1:输入

属性的所有字段进行搜索项。

items.find ({ "repo" : "docker-remote-repo" } ).transitive()

例1:输出

{"results": [{"repo": "docker-remote-repo-cache", "path": "alpine/latest", "name": "manifest. "json”、“类型”:“文件”、“大小”:528年,“创建”:“2021 - 03 - 21 - t13:54:52.383 + 02:00”、“created_by”:“管理”、“修改”:“2021 - 03 - 21 - t13:54:32.000 + 02:00”、“modified_by”:“管理”、“更新”:“2021 - 03 - 21 t13:54:52.384 + 02:00”},……),“范围”:{“start_pos”:0,“end_pos”:12,“总”:12}}

例2:输入

方法中列出的结果将搜索限制为包括部分。

items.find ({ "repo" : "docker-remote-repo" } ).include("name").transitive()

例2:输出

{"results": [{"name": "manifest. results . "Json "}, {"name": "sha256__4c0d98bf9879488e0407f897d9dd4bf758555a78e39675e72b5124ccf12c2580"}, {"name": "sha256__e50c909a8df2b7c8b92a6e8730e210ebe98e5082871e66edd8ef4d90838cbd25。标记"},{"repo": "docker-remote-repo", "name": "manifest. conf ", " list . conf ", " list . conf "。Json "}, {"repo": "docker-remote-repo", "name": "仓库。目录"},{"repo": "docker-remote-repo", "name": "sha256__4c0d98bf9879488e0407f897d9dd4bf758555a78e39675e72b5124ccf12c2580"}, {"repo": "docker-remote-repo", "name": "sha256__e50c909a8df2b7c8b92a6e8730e210ebe98e5082871e66edd8ef4d90838cbd25"}], "range": {"start_pos": 0, "end_pos": 7, "total": 7}}



使用虚拟存储库

AQL支持虚拟存储库。由于虚拟存储库仅通过它们所包含的本地存储库间接地包含项,因此制定了几个约定,如下几节所述。

在虚拟存储库上进行过滤

可以将查询限制在指定的虚拟存储库中进行搜索。实际上,这意味着该查询将应用于指定虚拟存储库中包含的本地存储库和远程存储库缓存。

例如,查找虚拟存储库中包含的任何存储库中的所有项我的虚拟

items.find ({"repo" : "my-virtual"})

输出字段

域有一个virtual_repos字段,其中包括包含已找到项的虚拟存储库。一般来说,要显示此字段,需要在查询中显式地将其指定为输出字段.但是,如果查询指定虚拟存储库作为搜索目标,则virtual_repos字段作为输出字段隐式包含在搜索结果中。

一个项目必须是可访问的才能被找到

搜索查询只能在虚拟存储库中找到可被该虚拟存储库访问的项目。例如,包含项的本地存储库可以指定和包含或排除模式它阻止封装虚拟存储库对项的访问。在这种情况下,搜索查询将找不到该项。

版权所有©2022 JFrog Ltd.