const COS = require('../lib/cos-wx-sdk-v5'); const config = require('../config'); const { cos, requestCallback } = require('../tools'); const metaDao = { '创建数据集 createDataset': createDataset, '更新数据集 updateDataset': updateDataset, '删除数据集 deleteDataset': deleteDataset, '列出数据集 describeDatasets': describeDatasets, '查询数据集 describeDataset': describeDataset, '绑定存储桶与数据集 createDatasetBinding': createDatasetBinding, '解绑存储桶与数据集 deleteDatasetBinding': deleteDatasetBinding, '查询数据集与存储桶的绑定关系 describeDatasetBinding': describeDatasetBinding, '查询绑定关系列表 describeDatasetBindings': describeDatasetBindings, '创建元数据索引 createFileMetaIndex': createFileMetaIndex, '删除元数据索引 deleteFileMetaIndex': deleteFileMetaIndex, '查询元数据索引 describeFileMetaIndex': describeFileMetaIndex, '更新元数据索引 updateFileMetaIndex': updateFileMetaIndex, '简单查询 datasetSimpleQuery': datasetSimpleQuery, '人脸搜索 datasetFaceSearch': datasetFaceSearch, '图像检索 searchImage': searchImage, }; /** * 元数据demo集合 */ // 从 Bucket 里拆出 AppId const AppId = config.Bucket.substr(config.Bucket.lastIndexOf('-') + 1); // 创建数据集 function createDataset() { const key = 'dataset'; // 固定值 const host = `${AppId}.ci.${config.Region}.myqcloud.com`; const url = `https://${host}/${key}`; const body = JSON.stringify({ // 数据集名称,同一个账户下唯一。命名规则如下: - 长度为1~128字符 - 只能包含英文字母,数字,短划线(-)和下划线() - 必须以英文字母和下划线()开头;是否必传:是 DatasetName: 'test-dataset-base', // 数据集描述信息。长度为1~256个英文或中文字符,默认值为空。;是否必传:否 Description: 'test-dataset-desc', // 指模板,在建立元数据索引时,后端将根据模板来决定收集哪些元数据。每个模板都包含一个或多个算子,不同的算子表示不同的元数据。目前支持的模板: Official:DefaultEmptyId:默认为空的模板,表示不进行元数据的采集。 Official:COSBasicMeta:基础信息模板,包含 COS 文件基础元信息算子,表示采集 COS 文件的名称、类型、ACL等基础元信息数据。 Official:FaceSearch:人脸检索模板,包含人脸检索、COS 文件基础元信息算子。Official:ImageSearch:图像检索模板,包含图像检索、COS 文件基础元信息算子。;是否必传:否 TemplateId: 'Official:COSBasicMeta', }); cos.request( { Method: 'POST', // 固定值,必须 Key: key, // 必须 Url: url, // 请求的url,必须 Body: body, // 请求体参数,必须 Headers: { // 设置请求体为 json,固定值,必须 'Content-Type': 'application/json', // 设置响应体为json,固定值,必须 Accept: 'application/json', }, }, function (err, data) { if (err) { // 处理请求失败 console.log(err); } else { // 处理请求成功 console.log(data); } } ); } // 更新数据集 function updateDataset() { const key = 'dataset'; // 固定值 const host = `${AppId}.ci.${config.Region}.myqcloud.com`; const url = `https://${host}/${key}`; const body = JSON.stringify({ // 数据集名称,同一个账户下唯一。;是否必传:是 DatasetName: 'test-dataset-base', // 数据集描述信息。长度为1~256个英文或中文字符,默认值为空。;是否必传:否 Description: 'test-dataset-base-desc1', // 该参数表示模板,在建立元数据索引时,后端将根据模板来决定收集哪些元数据。每个模板都包含一个或多个算子,不同的算子表示不同的元数据。目前支持的模板: Official:Empty:默认为空的模板,表示不进行元数据的采集。 Official:COSBasicMeta:基础信息模板,包含COS文件基础元信息算子,表示采集cos文件的名称、类型、acl等基础元信息数据。;是否必传:否 TemplateId: 'Official:COSBasicMeta', }); cos.request( { Method: 'PUT', // 固定值,必须 Key: key, // 必须 Url: url, // 请求的url,必须 Body: body, // 请求体参数,必须 Headers: { // 设置请求体为 json,固定值,必须 'Content-Type': 'application/json', // 设置响应体为json,固定值,必须 Accept: 'application/json', }, }, function (err, data) { if (err) { // 处理请求失败 console.log(err); } else { // 处理请求成功 console.log(data); } } ); } // 删除数据集 function deleteDataset() { const key = 'dataset'; // 固定值 const host = `${AppId}.ci.${config.Region}.myqcloud.com`; const url = `https://${host}/${key}`; const body = JSON.stringify({ // 数据集名称,同一个账户下唯一。;是否必传:是 DatasetName: 'test-dataset-base', }); cos.request( { Method: 'DELETE', // 固定值,必须 Key: key, // 必须 Url: url, // 请求的url,必须 Body: body, // 请求体参数,必须 Headers: { // 设置请求体为 json,固定值,必须 'Content-Type': 'application/json', // 设置响应体为json,固定值,必须 Accept: 'application/json', }, }, function (err, data) { if (err) { // 处理请求失败 console.log(err); } else { // 处理请求成功 console.log(data); } } ); } // 列出数据集 function describeDatasets() { const key = 'datasets'; // 固定值 const host = `${AppId}.ci.${config.Region}.myqcloud.com`; const url = `https://${host}/${key}`; cos.request( { Method: 'GET', // 固定值,必须 Key: key, // 必须 Url: url, // 请求的url,必须 Query: { // 本次返回数据集的最大个数,取值范围为0~200。不设置此参数或者设置为0时,则默认值为100。;是否必传:否 maxresults: 100, // 翻页标记。当文件总数大于设置的MaxResults时,用于翻页的Token。从NextToken开始按字典序返回文件信息列表。填写上次查询返回的值,首次使用时填写为空。;是否必传:否 // nexttoken: '', // 数据集名称前缀。;是否必传:否 // prefix: 'test', }, Headers: { // 设置响应体为json,固定值,必须 Accept: 'application/json', }, }, function (err, data) { if (err) { // 处理请求失败 console.log(err); } else { // 处理请求成功 console.log(data); } } ); } // 查询数据集 function describeDataset() { const key = 'dataset'; // 固定值 const host = `${AppId}.ci.${config.Region}.myqcloud.com`; const url = `https://${host}/${key}`; cos.request( { Method: 'GET', // 固定值,必须 Key: key, // 必须 Url: url, // 请求的url,必须 Query: { // 数据集名称,同一个账户下唯一。;是否必传:是 datasetname: 'test-dataset-base', // 是否需要实时统计数据集中文件相关信息。有效值: false:不统计,返回的文件的总大小、数量信息可能不正确也可能都为0。 true:需要统计,返回数据集中当前的文件的总大小、数量信息。 默认值为false。;是否必传:否 statistics: false, }, Headers: { // 设置请求体为 json,固定值,必须 'Content-Type': 'application/json', // 设置响应体为json,固定值,必须 Accept: 'application/json', }, }, function (err, data) { if (err) { // 处理请求失败 console.log(err); } else { // 处理请求成功 console.log(data); } } ); } // 绑定存储桶与数据集 function createDatasetBinding() { const key = 'datasetbinding'; // 固定值 const host = `${AppId}.ci.${config.Region}.myqcloud.com`; const url = `https://${host}/${key}`; const body = JSON.stringify({ // 数据集名称,同一个账户下唯一。;是否必传:是 DatasetName: 'test-dataset-imagesearch2', // 资源标识字段,表示需要与数据集绑定的资源,当前仅支持COS存储桶,字段规则:cos://,其中BucketName表示COS存储桶名称,例如:cos://examplebucket-1250000000;是否必传:是 URI: `cos://${config.Bucket}`, }); cos.request( { Method: 'POST', // 固定值,必须 Key: key, // 必须 Url: url, // 请求的url,必须 Body: body, // 请求体参数,必须 Headers: { // 设置请求体为 json,固定值,必须 'Content-Type': 'application/json', // 设置响应体为json,固定值,必须 Accept: 'application/json', }, }, function (err, data) { if (err) { // 处理请求失败 console.log(err); } else { // 处理请求成功 console.log(data); } } ); } // 解绑存储桶与数据集 function deleteDatasetBinding() { const key = 'datasetbinding'; // 固定值 const host = `${AppId}.ci.${config.Region}.myqcloud.com`; const url = `https://${host}/${key}`; const body = JSON.stringify({ // 数据集名称,同一个账户下唯一。;是否必传:是 DatasetName: 'test-dataset-imagesearch2', // 资源标识字段,表示需要与数据集绑定的资源,当前仅支持COS存储桶,字段规则:cos://,其中BucketName表示COS存储桶名称,例如:cos://examplebucket-1250000000;是否必传:是 URI: `cos://${config.Bucket}`, }); cos.request( { Method: 'DELETE', // 固定值,必须 Key: key, // 必须 Url: url, // 请求的url,必须 Body: body, // 请求体参数,必须 Headers: { // 设置请求体为 json,固定值,必须 'Content-Type': 'application/json', // 设置响应体为json,固定值,必须 Accept: 'application/json', }, }, function (err, data) { if (err) { // 处理请求失败 console.log(err); } else { // 处理请求成功 console.log(data); } } ); } // 查询数据集与存储桶的绑定关系 function describeDatasetBinding() { const key = 'datasetbinding'; // 固定值 const host = `${AppId}.ci.${config.Region}.myqcloud.com`; const url = `https://${host}/${key}`; cos.request( { Method: 'GET', // 固定值,必须 Key: key, // 必须 Url: url, // 请求的url,必须 Query: { // 数据集名称,同一个账户下唯一。;是否必传:是 datasetname: 'test-dataset-imagesearch2', // 资源标识字段,表示需要与数据集绑定的资源,当前仅支持COS存储桶,字段规则:cos://,其中BucketName表示COS存储桶名称,例如(需要进行urlencode):cos%3A%2F%2Fexample-125000;是否必传:是 uri: `cos://${config.Bucket}`, }, Headers: { // 设置响应体为json,固定值,必须 Accept: 'application/json', }, }, function (err, data) { if (err) { // 处理请求失败 console.log(err); } else { // 处理请求成功 console.log(data); } } ); } // 查询绑定关系列表 function describeDatasetBindings() { const key = 'datasetbindings'; // 固定值 const host = `${AppId}.ci.${config.Region}.myqcloud.com`; const url = `https://${host}/${key}`; cos.request( { Method: 'GET', // 固定值,必须 Key: key, // 必须 Url: url, // 请求的url,必须 Query: { // 数据集名称,同一个账户下唯一。;是否必传:否 datasetname: 'test-dataset-imagesearch2', // 返回绑定关系的最大个数,取值范围为0~200。不设置此参数或者设置为0时,则默认值为100。;是否必传:否 maxresults: 100, // 当绑定关系总数大于设置的MaxResults时,用于翻页的token。从NextToken开始按字典序返回绑定关系信息列表。第一次调用此接口时,设置为空。;是否必传:是 // nexttoken: '', }, Headers: { // 设置响应体为json,固定值,必须 Accept: 'application/json', }, }, function (err, data) { if (err) { // 处理请求失败 console.log(err); } else { // 处理请求成功 console.log(data); } } ); } // 创建元数据索引 function createFileMetaIndex() { const key = 'filemeta'; // 固定值 const host = `${AppId}.ci.${config.Region}.myqcloud.com`; const url = `https://${host}/${key}`; const body = JSON.stringify({ // 数据集名称,同一个账户下唯一。;是否必传:是 DatasetName: 'test-dataset-imagesearch2', // 元数据索引结果(以回调形式发送至您的回调地址,支持以 http:// 或者 https:// 开头的地址,例如: http://www.callback.com。;是否必传:否 // Callback: 'http://www.callback.com', // 用于建立索引的文件信息。;是否必传:是 File: { // 自定义ID。该文件索引到数据集后,作为该行元数据的属性存储,用于和您的业务系统进行关联、对应。您可以根据业务需求传入该值,例如将某个URI关联到您系统内的某个ID。推荐传入全局唯一的值。在查询时,该字段支持前缀查询和排序,详情请见字段和操作符的支持列表。 ;是否必传:否 // CustomId: '001', // 自定义标签。您可以根据业务需要自定义添加标签键值对信息,用于在查询时可以据此为筛选项进行检索,详情请见字段和操作符的支持列表。 ;是否必传:否 // CustomLabels: {"age":"18","level":"18"}, // 可选项,文件媒体类型,枚举值: image:图片。 other:其他。 document:文档。 archive:压缩包。 video:视频。 audio:音频。 ;是否必传:否 MediaType: 'image', // 可选项,文件内容类型(MIME Type),如image/jpeg。 ;是否必传:否 ContentType: 'image/jpeg', // 资源标识字段,表示需要建立索引的文件地址,当前仅支持COS上的文件,字段规则:cos:///,其中BucketName表示COS存储桶名称,ObjectKey表示文件完整路径,例如:cos://examplebucket-1250000000/test1/img.jpg。 注意: 1、仅支持本账号内的COS文件 2、不支持HTTP开头的地址;是否必传:是 URI: `cos://${config.Bucket}/ci/dog.jpeg`, // 输入图片中检索的人脸数量,默认值为20,最大值为20。(仅当数据集模板 ID 为 Official:FaceSearch 有效)。;是否必传:否 // MaxFaceNum: 20, // 自定义人物属性(仅当数据集模板 ID 为 Official:FaceSearch 有效)。;是否必传:否 // Persons: { // }, }, }); cos.request( { Method: 'POST', // 固定值,必须 Key: key, // 必须 Url: url, // 请求的url,必须 Body: body, // 请求体参数,必须 Headers: { // 设置请求体为 json,固定值,必须 'Content-Type': 'application/json', // 设置响应体为json,固定值,必须 Accept: 'application/json', }, }, function (err, data) { if (err) { // 处理请求失败 console.log(err); } else { // 处理请求成功 console.log(data); } } ); } // 删除元数据索引 function deleteFileMetaIndex() { const key = 'filemeta'; // 固定值 const host = `${AppId}.ci.${config.Region}.myqcloud.com`; const url = `https://${host}/${key}`; const body = JSON.stringify({ // 数据集名称,同一个账户下唯一。;是否必传:是 DatasetName: 'test-dataset-imagesearch2', // 资源标识字段,表示需要建立索引的文件地址。;是否必传:是 URI: `cos://${config.Bucket}/1.png`, }); cos.request( { Method: 'DELETE', // 固定值,必须 Key: key, // 必须 Url: url, // 请求的url,必须 Body: body, // 请求体参数,必须 Headers: { // 设置请求体为 json,固定值,必须 'Content-Type': 'application/json', // 设置响应体为json,固定值,必须 Accept: 'application/json', }, }, function (err, data) { if (err) { // 处理请求失败 console.log(err); } else { // 处理请求成功 console.log(data); } } ); } // 查询元数据索引 function describeFileMetaIndex() { const key = 'filemeta'; // 固定值 const host = `${AppId}.ci.${config.Region}.myqcloud.com`; const url = `https://${host}/${key}`; cos.request( { Method: 'GET', // 固定值,必须 Key: key, // 必须 Url: url, // 请求的url,必须 Query: { // 数据集名称,同一个账户下唯一。;是否必传:是 datasetname: 'test-dataset-imagesearch2', // 资源标识字段,表示需要建立索引的文件地址,当前仅支持COS上的文件,字段规则:cos:///,其中BucketName表示COS存储桶名称,ObjectKey表示文件完整路径,例如:cos://examplebucket-1250000000/test1/img.jpg。 注意: 1、仅支持本账号内的COS文件 2、不支持HTTP开头的地址 3、需UrlEncode;是否必传:是 uri: `cos://${config.Bucket}/ci/dog.jpeg`, }, Headers: { // 设置响应体为json,固定值,必须 Accept: 'application/json', }, }, function (err, data) { if (err) { // 处理请求失败 console.log(err.message); } else { // 处理请求成功 console.log(data); } } ); } // 更新元数据索引 function updateFileMetaIndex() { const key = 'filemeta'; // 固定值 const host = `${AppId}.ci.${config.Region}.myqcloud.com`; const url = `https://${host}/${key}`; const body = JSON.stringify({ // 数据集名称,同一个账户下唯一。;是否必传:是 DatasetName: 'test-dataset-imagesearch2', // 元数据索引结果(以回调形式发送至您的回调地址,支持以 http:// 或者 https:// 开头的地址,例如: http://www.callback.com;是否必传:是 // Callback: 'http://www.callback.com', // 用于建立索引的文件信息。;是否必传:是 File: { // 自定义ID。该文件索引到数据集后,作为该行元数据的属性存储,用于和您的业务系统进行关联、对应。您可以根据业务需求传入该值,例如将某个URI关联到您系统内的某个ID。推荐传入全局唯一的值。在查询时,该字段支持前缀查询和排序,详情请见字段和操作符的支持列表。 ;是否必传:否 CustomId: '002', // 自定义标签。您可以根据业务需要自定义添加标签键值对信息,用于在查询时可以据此为筛选项进行检索,详情请见字段和操作符的支持列表。 ;是否必传:否 // CustomLabels: { age: '18', level: '18' }, // 可选项,文件媒体类型,枚举值: image:图片。 other:其他。 document:文档。 archive:压缩包。 video:视频。 audio:音频。 ;是否必传:否 MediaType: 'image', // 可选项,文件内容类型(MIME Type),如image/jpeg。 ;是否必传:否 ContentType: 'image/jpeg', // 资源标识字段,表示需要建立索引的文件地址,当前仅支持COS上的文件,字段规则:cos:///,其中BucketName表示COS存储桶名称,ObjectKey表示文件完整路径,例如:cos://examplebucket-1250000000/test1/img.jpg。 注意: 1、仅支持本账号内的COS文件 2、不支持HTTP开头的地址;是否必传:是 URI: `cos://${config.Bucket}/ci/dog.jpeg`, // 自定义人物属性(仅当数据集模板 ID 为 Official:FaceSearch 有效)。;是否必传:否 // Persons: {}, }, }); cos.request( { Method: 'PUT', // 固定值,必须 Key: key, // 必须 Url: url, // 请求的url,必须 Body: body, // 请求体参数,必须 Headers: { // 设置请求体为 json,固定值,必须 'Content-Type': 'application/json', // 设置响应体为json,固定值,必须 Accept: 'application/json', }, }, function (err, data) { if (err) { // 处理请求失败 console.log(err); } else { // 处理请求成功 console.log(data); } } ); } // 简单查询 function datasetSimpleQuery() { const key = 'datasetquery/simple'; // 固定值 const host = `${AppId}.ci.${config.Region}.myqcloud.com`; const url = `https://${host}/${key}`; const body = JSON.stringify({ // 数据集名称,同一个账户下唯一。;是否必传:是 DatasetName: 'test-dataset-base', // 简单查询参数条件,可自嵌套。;是否必传:否 // Query: { // // 操作运算符。枚举值: not:逻辑非。 or:逻辑或。 and:逻辑与。 lt:小于。 lte:小于等于。 gt:大于。 gte:大于等于。 eq:等于。 exist:存在性查询。 prefix:前缀查询。 match-phrase:字符串匹配查询。 nested:字段为数组时,其中同一对象内逻辑条件查询。;是否必传:是 // Operation: 'and', // // 子查询的结构体。 只有当Operations为逻辑运算符(and、or、not或nested)时,才能设置子查询条件。 在逻辑运算符为and/or/not时,其SubQueries内描述的所有条件需符合父级设置的and/or/not逻辑关系。 在逻辑运算符为nested时,其父级的Field必须为一个数组类的字段(如:Labels)。 子查询条件SubQueries组的Operation必须为and/or/not中的一个或多个,其Field必须为父级Field的子属性。;是否必传:否 // SubQueries: [{ // Operation: '', // Field: '', // }], // Field: '', // Value: '', // }, // 返回文件元数据的最大个数,取值范围为0200。 使用聚合参数时,该值表示返回分组的最大个数,取值范围为02000。 不设置此参数或者设置为0时,则取默认值100。;是否必传:否 MaxResults: 100, // 排序字段列表。请参考字段和操作符的支持列表。 多个排序字段可使用半角逗号(,)分隔,例如:Size,Filename。 最多可设置5个排序字段。 排序字段顺序即为排序优先级顺序。;是否必传:是 // Sort: 'CustomId', // 排序字段的排序方式。取值如下: asc:升序; desc(默认):降序。 多个排序方式可使用半角逗号(,)分隔,例如:asc,desc。 排序方式不可多于排序字段,即参数Order的元素数量需小于等于参数Sort的元素数量。例如Sort取值为Size,Filename时,Order可取值为asc,desc或asc。 排序方式少于排序字段时,未排序的字段默认取值asc。例如Sort取值为Size,Filename,Order取值为asc时,Filename默认排序方式为asc,即升序排列;是否必传:是 Order: 'desc', // 聚合字段信息列表。 当您使用聚合查询时,仅返回聚合结果,不再返回匹配到的元信息列表。;是否必传:否 // Aggregations: { // Operation: '', // Field: '' // }, }); cos.request( { Method: 'POST', // 固定值,必须 Key: key, // 必须 Url: url, // 请求的url,必须 Body: body, // 请求体参数,必须 Headers: { // 设置请求体为 json,固定值,必须 'Content-Type': 'application/json', // 设置响应体为json,固定值,必须 Accept: 'application/json', }, }, function (err, data) { if (err) { // 处理请求失败 console.log(err); } else { // 处理请求成功 console.log(data); } } ); } // 人脸搜索 function datasetFaceSearch() { const key = 'datasetquery/facesearch'; // 固定值 const host = `${AppId}.ci.${config.Region}.myqcloud.com`; const url = `https://${host}/${key}`; const body = JSON.stringify({ // 数据集名称,同一个账户下唯一。;是否必传:是 DatasetName: 'test-dataset-facesearch', // 资源标识字段,表示需要建立索引的文件地址。;是否必传:是 URI: `cos://${config.Bucket}/ci/1.jpg`, // 输入图片中检索的人脸数量,默认值为1(传0或不传采用默认值),最大值为10。;是否必传:否 MaxFaceNum: 1, // 检索的每张人脸返回相关人脸数量,默认值为10,最大值为100。;是否必传:否 Limit: 10, // 出参 Score 中,只有超过 MatchThreshold 值的结果才会返回。范围:1-100,默认值为0,推荐值为80。;是否必传:否 MatchThreshold: 10, }); cos.request( { Method: 'POST', // 固定值,必须 Key: key, // 必须 Url: url, // 请求的url,必须 Body: body, // 请求体参数,必须 Headers: { // 设置请求体为 json,固定值,必须 'Content-Type': 'application/json', // 设置响应体为json,固定值,必须 Accept: 'application/json', }, }, function (err, data) { if (err) { // 处理请求失败 console.log(err); } else { // 处理请求成功 console.log(data); } } ); } // 图像检索 function searchImage() { const key = 'datasetquery/imagesearch'; // 固定值 const host = `${AppId}.ci.${config.Region}.myqcloud.com`; const url = `https://${host}/${key}`; const body = JSON.stringify({ // 数据集名称,同一个账户下唯一。;是否必传:是 DatasetName: 'test-dataset-imagesearch2', // 指定检索方式为图片或文本,pic 为图片检索,text 为文本检索,默认为 pic。;是否必传:否 Mode: 'pic', // 资源标识字段,表示需要建立索引的文件地址(Mode 为 pic 时必选)。;是否必传:否 URI: `cos://${config.Bucket}/ci/dog.jpeg`, // 返回相关图片的数量,默认值为10,最大值为100。;是否必传:否 Limit: 10, // 出参 Score(相关图片匹配得分) 中,只有超过 MatchThreshold 值的结果才会返回。默认值为0,推荐值为80。;是否必传:否 MatchThreshold: 1, }); cos.request( { Method: 'POST', // 固定值,必须 Key: key, // 必须 Url: url, // 请求的url,必须 Body: body, // 请求体参数,必须 Headers: { // 设置请求体为 json,固定值,必须 'Content-Type': 'application/json', // 设置响应体为json,固定值,必须 Accept: 'application/json', }, }, function (err, data) { if (err) { // 处理请求失败 console.log(err); } else { // 处理请求成功 console.log(data); } } ); } module.exports = metaDao;