全部产品
Search
文档中心

智能媒体管理:建立元数据索引

更新时间:Oct 29, 2024

创建数据集后,您可以为存储在对象存储(OSS)、相册与网盘服务(PDS)等产品中的文件建立元数据索引。通过建立元数据索引,您可以更有效地管理和检索大量的媒体文件。本文将介绍如何建立和管理元数据索引,以便于快速搜索、筛选和管理您的媒体资源。

前提条件

已创建数据集。具体操作,请参见创建数据集

概述

元数据索引是指对媒体文件中的关键信息进行结构化和索引化,以便有效地管理和检索这些媒体文件。这些元数据可以包括但不限于媒体文件的标题、作者、关键词、描述、创建日期、大小、格式、分辨率等信息。通过建立元数据索引,用户可以方便地通过关键词、属性或其他标识快速地检索、筛选和管理大量的媒体文件,使媒体资源的利用更加高效和便捷。

操作步骤

您可以选择自动为OSS Bucket中所有文件建立元数据索引或者手动为OSS Bucket或PDS中的指定文件建立元数据索引。

自动为OSS Bucket中所有文件建立元数据索引

如果您需要自动为OSS Bucket中所有文件建立元数据索引,请调用接口CreateBinding - 创建绑定任务创建数据集和OSS Bucket的绑定关系。绑定关系创建后,智能媒体管理会先对OSS Bucket中已有的数据进行全量扫描,并抽取文件元数据信息进行索引。完成后,继续对OSS中新增的文件进行实时的增量追踪扫描、抽取以及索引。

警告

重要:一旦绑定任务创建成功,将会对您对应OSS Bucket内的文件进行存量或增量扫描,当您 Bucket 中的 Object 数量越多时,元数据扫描时产生的费用将越多,详情请查看 IMM计费说明。如果您尚未确定其效果,或正在进行测试,请选择文件数量较少的OSS Bucket,并谨慎选择工作流模板,以免给您带来非预期费用。

如下以在test-project项目下的test-dataset数据集,为test-bucket中的所有文件建立元数据索引为例。

  1. 调用CreateBinding - 创建绑定任务接口为数据集和OSS Bucket建立绑定关系。

    • 请求示例

      {
          "ProjectName": "test-project",
          "URI": "oss://test-bucket",
          "DatasetName": "test-dataset"
      }
    • 返回示例

      {
          "Binding": {
              "Phase": "",
              "ProjectName": "test-project",
              "DatasetName": "test-dataset",
              "State": "Ready",
              "CreateTime": "2022-07-06T07:03:28.054762739+08:00",
              "UpdateTime": "2022-07-06T07:03:28.054762739+08:00",
              "URI": "oss://test-bucket"
          },
          "RequestId": "090D2AC5-8450-0AA8-A1B1-****"
      }
    • 完整示例代码(以Python SDK为例)

      # -*- coding: utf-8 -*-
      
      import os
      from alibabacloud_imm20200930.client import Client as imm20200930Client
      from alibabacloud_tea_openapi import models as open_api_models
      from alibabacloud_imm20200930 import models as imm_20200930_models
      from alibabacloud_tea_util import models as util_models
      from alibabacloud_tea_util.client import Client as UtilClient
      
      
      class Sample:
          def __init__(self):
              pass
      
          @staticmethod
          def create_client(
              access_key_id: str,
              access_key_secret: str,
          ) -> imm20200930Client:
              """
              使用AccessKey ID&AccessKey Secret初始化账号Client。
              @param access_key_id:
              @param access_key_secret:
              @return: Client
              @throws Exception
              """
              config = open_api_models.Config(
                  access_key_id=access_key_id,
                  access_key_secret=access_key_secret
              )
              # 填写访问的域名。
              config.endpoint = f'imm.cn-beijing.aliyuncs.com'
              return imm20200930Client(config)
      
          @staticmethod
          def main() -> None:
              # 阿里云账号AccessKey拥有所有API的访问权限,建议您使用RAM用户进行API访问或日常运维。
              # 强烈建议不要把AccessKey ID和AccessKey Secret保存到工程代码里,否则可能导致AccessKey泄露,威胁您账号下所有资源的安全。
              # 本示例通过从环境变量中读取AccessKey,来实现API访问的身份验证。如何配置环境变量,请参见https://help.aliyun.com/document_detail/2361894.html。
              imm_access_key_id = os.getenv("AccessKeyId")
              imm_access_key_secret = os.getenv("AccessKeySecret")
              client = Sample.create_client(imm_access_key_id, imm_access_key_secret)
              create_binding_request = imm_20200930_models.CreateBindingRequest(
                  # 填写IMM项目名称。
                  project_name='test-project',
                  # 填写IMM数据集名称。
                  dataset_name='test-dataset',
                  # 填写需要绑定的OSS Bucket地址。
                  uri='oss://test-bucket'
              )
              runtime = util_models.RuntimeOptions()
              try:
                  # 打印API的返回值。
                  response = client.create_binding_with_options(create_binding_request, runtime)
                  print(response.body.to_map())
              except Exception as error:
                  # 如有需要,请打印错误信息。
                  UtilClient.assert_as_string(error.message)
                  print(error)
      
      
      if __name__ == '__main__':
          Sample.main()
  2. 可选:调用GetBinding - 查询绑定信息接口查询绑定运行状态信息。

    • 请求示例

      {
          "ProjectName": "test-project",
          "URI": "oss://test-bucket",
          "DatasetName": "test-dataset"
      }
    • 返回示例

      {
          "Binding": {
              "Phase": "IncrementalScanning",
              "ProjectName": "test-project",
              "DatasetName": "test-dataset",
              "State": "Running",
              "CreateTime": "2022-07-06T07:04:05.105182822+08:00",
              "UpdateTime": "2022-07-06T07:04:13.302084076+08:00",
              "URI": "oss://test-bucket"
          },
          "RequestId": "B5A9F54B-6C54-03C9-B011-****"
      }
      说明
      • Phase(阶段)为IncrementalScanning表示OSS Bucket历史数据建立元数据索引已经完成,IMM在扫描增量文件,为增量文件建立元数据索引。

      • State(绑定状态)为Running,表示绑定任务正在运行中。

    • 完整示例代码(以1.27.3版本的Python SDK为例)

      # -*- coding: utf-8 -*-
      
      import os
      from alibabacloud_imm20200930.client import Client as imm20200930Client
      from alibabacloud_tea_openapi import models as open_api_models
      from alibabacloud_imm20200930 import models as imm_20200930_models
      from alibabacloud_tea_util import models as util_models
      from alibabacloud_tea_util.client import Client as UtilClient
      
      
      class Sample:
          def __init__(self):
              pass
      
          @staticmethod
          def create_client(
              access_key_id: str,
              access_key_secret: str,
          ) -> imm20200930Client:
              """
              使用AccessKey ID&AccessKey Secret初始化账号Client。
              @param access_key_id:
              @param access_key_id:
              @param access_key_secret:
              @return: Client
              @throws Exception
              """
              config = open_api_models.Config(
                  access_key_id=access_key_id,
                  access_key_secret=access_key_secret
              )
              # 填写访问的域名。
              config.endpoint = f'imm.cn-beijing.aliyuncs.com'
              return imm20200930Client(config)
      
          @staticmethod
          def main() -> None:
              # 阿里云账号AccessKey拥有所有API的访问权限,建议您使用RAM用户进行API访问或日常运维。
              # 强烈建议不要把AccessKey ID和AccessKey Secret保存到工程代码里,否则可能导致AccessKey泄露,威胁您账号下所有资源的安全。
              # 本示例通过从环境变量中读取AccessKey,来实现API访问的身份验证。如何配置环境变量,请参见https://help.aliyun.com/document_detail/2361894.html。
              imm_access_key_id = os.getenv("AccessKeyId")
              imm_access_key_secret = os.getenv("AccessKeySecret")
              client = Sample.create_client(imm_access_key_id, imm_access_key_secret)
              get_binding_request = imm_20200930_models.GetBindingRequest(
                  # 填写IMM项目名称。
                  project_name='test-project',
                  # 填写IMM数据集名称。
                  dataset_name='test-dataset',
                  # 填写绑定的OSS Bucket地址。
                  uri='oss://test-bucket'
              )
              runtime = util_models.RuntimeOptions()
              try:
                  # 打印API的返回值。
                  response = client.get_binding_with_options(get_binding_request, runtime)
                  print(response.body.to_map())
              except Exception as error:
                  # 如有需要,请打印错误信息。
                  UtilClient.assert_as_string(error.message)
                  print(error)
      
      
      if __name__ == '__main__':
          Sample.main()

手动为OSS Bucket或PDS中指定文件建立元数据索引

如果您需要手动为OSS Bucket或PDS中指定文件建立元数据索引,请调用BatchIndexFileMeta - 批量索引文件元信息或者IndexFileMeta - 索引文件元信息接口为文件建立元数据索引。

  • 调用BatchIndexFileMeta - 批量索引文件元信息接口

    如下以在test-project项目下的test-dataset数据集,为OSS文件oss://test-bucket/test-object1.jpgoss://test-bucket/test-object2.jpg建立元数据索引为例。

    • 请求示例

      {
        "ProjectName": "test-project",
        "DatasetName": "test-dataset",
        "Files": [
          {
            "URI": "oss://test-bucket/test-object1.jpg",
            "CustomLabels": {
              "category": "人物"
            }
          },
          {
            "URI": "oss://test-bucket/test-object2.jpg",
            "CustomLabels": {
              "category": "宠物"
            }
          }
        ],
        "Notification": {
          "MNS": {
            "TopicName": "test-topic"
          }
        }
      }
    • 返回示例

      {
          "RequestId": "0D4CB096-EB44-02D6-A4E9-****",
          "EventId": "16C-1KoeYbdckkiOObpyzc****"
      }
    • MNS消息(结果在MNS消息中返回,关于MNS SDK的详细信息,请参见步骤四:接收和删除消息。)

      {
          "ProjectName": "test-project",
          "DatasetName": "test-dataset",
          "RequestId": "658FFD57-B495-07C0-B24B-B64CC52993CB",
          "StartTime": "2022-07-06T07:18:18.664770352+08:00",
          "EndTime": "2022-07-06T07:18:20.762465221+08:00",
          "Success": true,
          "Message": "",
          "Files": [
              {
                  "URI": "oss://test-bucket/test-object1.jpg",
                  "CustomLabels": {
                      "category": "人物"
                  },
                  "Error": ""
              },
              {
                  "URI": "oss://test-bucket/test-object2.jpg",
                  "CustomLabels": {
                      "category": "宠物"
                  },
                  "Error": ""
              }
          ]
      }
      说明
      • Successtrue表示建立元数据索引任务执行成功。

      • Files中返回了每一个文件的URI和错误信息,当Error为空时表示该文件建立元数据索引成功。

    • 完整示例代码(以Python SDK为例)

      # -*- coding: utf-8 -*-
      # This file is auto-generated, don't edit it. Thanks.
      import sys
      import os
      
      from typing import List
      
      from alibabacloud_imm20200930.client import Client as imm20200930Client
      from alibabacloud_tea_openapi import models as open_api_models
      from alibabacloud_imm20200930 import models as imm_20200930_models
      from alibabacloud_tea_util import models as util_models
      from alibabacloud_tea_util.client import Client as UtilClient
      
      
      class Sample:
          def __init__(self):
              pass
      
          @staticmethod
          def create_client(
              access_key_id: str,
              access_key_secret: str,
          ) -> imm20200930Client:
              """
              使用AccessKey ID&AccessKey Secret初始化账号Client。
              @param access_key_id:
              @param access_key_secret:
              @return: Client
              @throws Exception
              """
              config = open_api_models.Config(
                  access_key_id=access_key_id,
                  access_key_secret=access_key_secret
              )
              # 填写访问的域名。
              config.endpoint = f'imm.cn-beijing.aliyuncs.com'
              return imm20200930Client(config)
      
          @staticmethod
          def main(
              args: List[str],
          ) -> None:
              # 阿里云账号AccessKey拥有所有API的访问权限,建议您使用RAM用户进行API访问或日常运维。
              # 强烈建议不要把AccessKey ID和AccessKey Secret保存到工程代码里,否则可能导致AccessKey泄露,威胁您账号下所有资源的安全。
              # 本示例通过从环境变量中读取AccessKey,来实现API访问的身份验证。如何配置环境变量,请参见https://help.aliyun.com/document_detail/2361894.html。
              imm_access_key_id = os.getenv("AccessKeyId")
              imm_access_key_secret = os.getenv("AccessKeySecret")
              client = Sample.create_client(imm_access_key_id, imm_access_key_secret)
              notification_mns = imm_20200930_models.MNS(
                  topic_name='test-topic'
              )
              notification = imm_20200930_models.Notification(
                  mns=notification_mns
              )
              input_file_0custom_labels = {
                  'category': '人物'
              }
              input_file_0 = imm_20200930_models.InputFile(
                  uri='oss://test-bucket/test-object1.jpg',
                  custom_labels=input_file_0custom_labels
              )
              input_file_1custom_labels = {
                  'category': '宠物'
              }
              input_file_1 = imm_20200930_models.InputFile(
                  uri='oss://test-bucket/test-object2.jpg',
                  custom_labels=input_file_1custom_labels
              )
              batch_index_file_meta_request = imm_20200930_models.BatchIndexFileMetaRequest(
                  project_name='test-project',
                  dataset_name='test-dataset',
                  files=[
                      input_file_0,
                      input_file_1
                  ],
                  notification=notification
              )
              runtime = util_models.RuntimeOptions()
              try:
                  # 复制代码运行请自行打印API的返回值。
                  client.batch_index_file_meta_with_options(batch_index_file_meta_request, runtime)
              except Exception as error:
                  # 如有需要,请打印错误信息。
                  UtilClient.assert_as_string(error.message)
      
          @staticmethod
          async def main_async(
              args: List[str],
          ) -> None:
              # 阿里云账号AccessKey拥有所有API的访问权限,建议您使用RAM用户进行API访问或日常运维。
              # 强烈建议不要把AccessKey ID和AccessKey Secret保存到工程代码里,否则可能导致AccessKey泄露,威胁您账号下所有资源的安全。
              # 本示例通过从环境变量中读取AccessKey,来实现API访问的身份验证。如何配置环境变量,请参见https://help.aliyun.com/document_detail/2361894.html。
              imm_access_key_id = os.getenv("AccessKeyId")
              imm_access_key_secret = os.getenv("AccessKeySecret")
              client = Sample.create_client(imm_access_key_id, imm_access_key_secret)
              notification_mns = imm_20200930_models.MNS(
                  topic_name='test-topic'
              )
              notification = imm_20200930_models.Notification(
                  mns=notification_mns
              )
              input_file_0custom_labels = {
                  'category': '人物'
              }
              input_file_0 = imm_20200930_models.InputFile(
                  uri='oss://test-bucket/test-object1.jpg',
                  custom_labels=input_file_0custom_labels
              )
              input_file_1custom_labels = {
                  'category': '宠物'
              }
              input_file_1 = imm_20200930_models.InputFile(
                  uri='oss://test-bucket/test-object2.jpg',
                  custom_labels=input_file_1custom_labels
              )
              batch_index_file_meta_request = imm_20200930_models.BatchIndexFileMetaRequest(
                  project_name='test-project',
                  dataset_name='test-dataset',
                  files=[
                      input_file_0,
                      input_file_1
                  ],
                  notification=notification
              )
              runtime = util_models.RuntimeOptions()
              try:
                  # 复制代码运行请自行打印API的返回值。
                  await client.batch_index_file_meta_with_options_async(batch_index_file_meta_request, runtime)
              except Exception as error:
                  # 如有需要,请打印错误信息。
                  UtilClient.assert_as_string(error.message)
      
      
      if __name__ == '__main__':
          Sample.main(sys.argv[1:])
  • 调用IndexFileMeta - 文件元信息建立索引接口

    如下以在test-project项目下的test-dataset数据集,为OSS文件oss://test-bucket/test-object1.jpg建立元数据索引为例。

    • 请求示例

      {
        "ProjectName": "test-project",
        "DatasetName": "test-dataset",
        "File": {
          "URI": "oss://test-bucket/test-object1.jpg",
          "CustomLabels": {
            "category": "人物"
          }
        },
        "Notification": {
          "MNS": {
            "TopicName": "test-topic"
          }
        }
      }
    • 返回示例

      {
          "RequestId": "5AA694AD-3D10-0B6A-85B2-****",
          "EventId": "17C-1Kofq1mlJxRYF7vAGF****"
      }
    • MNS消息(结果在MNS消息中返回,关于MNS SDK的详细信息,请参见步骤四:接收和删除消息。)

      {
          "ProjectName": "test-project",
          "DatasetName": "test-dataset",
          "RequestId": "658FFD57-B495-07C0-B24B-B64CC52993CB",
          "StartTime": "2022-07-06T07:18:18.664770352+08:00",
          "EndTime": "2022-07-06T07:18:20.762465221+08:00",
          "Success": true,
          "Message": "",
          "Files": [
              {
                  "URI": "oss://test-bucket/test-object1.jpg",
                  "CustomLabels": {
                      "category": "人物"
                  },
                  "Error": ""
              }
          ]
      }
      说明
      • Successtrue表示建立元数据索引任务执行成功。

      • Files中返回文件的URI和错误信息,当Error为空时表示该文件建立元数据索引成功。

    • 完整示例代码(以Python SDK为例)

      # -*- coding: utf-8 -*-
      # This file is auto-generated, don't edit it. Thanks.
      import sys
      import os
      
      from typing import List
      
      from alibabacloud_imm20200930.client import Client as imm20200930Client
      from alibabacloud_tea_openapi import models as open_api_models
      from alibabacloud_imm20200930 import models as imm_20200930_models
      from alibabacloud_tea_util import models as util_models
      from alibabacloud_tea_util.client import Client as UtilClient
      
      
      class Sample:
          def __init__(self):
              pass
      
          @staticmethod
          def create_client(
              access_key_id: str,
              access_key_secret: str,
          ) -> imm20200930Client:
              """
              使用AccessKey ID&AccessKey Secret初始化账号Client。
              @param access_key_id:
              @param access_key_secret:
              @return: Client
              @throws Exception
              """
              config = open_api_models.Config(
                  access_key_id=access_key_id,
                  access_key_secret=access_key_secret
              )
              # 填写访问的域名。
              config.endpoint = f'imm.cn-beijing.aliyuncs.com'
              return imm20200930Client(config)
      
          @staticmethod
          def main(
              args: List[str],
          ) -> None:
              # 阿里云账号AccessKey拥有所有API的访问权限,建议您使用RAM用户进行API访问或日常运维。
              # 强烈建议不要把AccessKey ID和AccessKey Secret保存到工程代码里,否则可能导致AccessKey泄露,威胁您账号下所有资源的安全。
              # 本示例通过从环境变量中读取AccessKey,来实现API访问的身份验证。如何配置环境变量,请参见https://help.aliyun.com/document_detail/2361894.html。
              imm_access_key_id = os.getenv("AccessKeyId")
              imm_access_key_secret = os.getenv("AccessKeySecret")
              client = Sample.create_client(imm_access_key_id, imm_access_key_secret)
              notification_mns = imm_20200930_models.MNS(
                  topic_name='test-topic'
              )
              notification = imm_20200930_models.Notification(
                  mns=notification_mns
              )
              input_file_custom_labels = {
                  'category': '人物'
              }
              input_file = imm_20200930_models.InputFile(
                  uri='oss://test-bucket/test-object1.jpg',
                  custom_labels=input_file_custom_labels
              )
              index_file_meta_request = imm_20200930_models.IndexFileMetaRequest(
                  project_name='test-project',
                  dataset_name='test-dataset',
                  file=input_file,
                  notification=notification
              )
              runtime = util_models.RuntimeOptions()
              try:
                  # 复制代码运行请自行打印API的返回值。
                  client.index_file_meta_with_options(index_file_meta_request, runtime)
              except Exception as error:
                  # 如有需要,请打印错误信息。
                  UtilClient.assert_as_string(error.message)
      
          @staticmethod
          async def main_async(
              args: List[str],
          ) -> None:
              # 阿里云账号AccessKey拥有所有API的访问权限,建议您使用RAM用户进行API访问或日常运维。
              # 强烈建议不要把AccessKey ID和AccessKey Secret保存到工程代码里,否则可能导致AccessKey泄露,威胁您账号下所有资源的安全。
              # 本示例通过从环境变量中读取AccessKey,来实现API访问的身份验证。如何配置环境变量,请参见https://help.aliyun.com/document_detail/2361894.html。
              imm_access_key_id = os.getenv("AccessKeyId")
              imm_access_key_secret = os.getenv("AccessKeySecret")
              client = Sample.create_client(imm_access_key_id, imm_access_key_secret)
              notification_mns = imm_20200930_models.MNS(
                  topic_name='test-topic'
              )
              notification = imm_20200930_models.Notification(
                  mns=notification_mns
              )
              input_file_custom_labels = {
                  'category': '人物'
              }
              input_file = imm_20200930_models.InputFile(
                  uri='oss://test-bucket/test-object1.jpg',
                  custom_labels=input_file_custom_labels
              )
              index_file_meta_request = imm_20200930_models.IndexFileMetaRequest(
                  project_name='test-project',
                  dataset_name='test-dataset',
                  file=input_file,
                  notification=notification
              )
              runtime = util_models.RuntimeOptions()
              try:
                  # 复制代码运行请自行打印API的返回值。
                  await client.index_file_meta_with_options_async(index_file_meta_request, runtime)
              except Exception as error:
                  # 如有需要,请打印错误信息。
                  UtilClient.assert_as_string(error.message)
      
      
      if __name__ == '__main__':
          Sample.main(sys.argv[1:])