查询文件信息

建立元数据索引后,您可以调用相关接口查询单个或多个指定文件的元数据信息,也可以通过字段搜索、关键字模糊搜索、自然语言关键字搜索的方式进行查询。本文介绍如何查询文件信息。

前提条件

已根据使用场景为文件建立元数据索引。具体操作,请参见建立元数据索引

查询方式

支持对文件信息进行查询和搜索的方式如下表所示。

查询方式

说明

查询单个指定文件信息

调用GetFileMeta - 获取文件元数据接口可以查询单个指定文件的信息。

查询多个指定文件信息

调用BatchGetFileMeta - 批量获取文件元数据接口可以查询多个指定文件的信息。

简单查询

调用SimpleQuery - 简单查询接口可以查询满足指定条件的文件,并按照指定字段和排序方式列出文件信息。

调用SimpleQuery接口时,您也可以通过Query的嵌套使用实现复杂查询,以及通过聚合操作实现对不同字段的值进行统计和分析。支持的字段和操作符请参见字段和操作符的支持列表

模糊查询

调用FuzzyQuery - 模糊查询接口可以查询匹配指定字符串的所有文件,并列出文件信息。

调用FuzzyQuery接口时,智能媒体管理服务会从所有已提取的文件元数据中查询指定字符串,例如从文件名、标签、路径、自定义标签、文本等字段中查询。只要文件元数据中有一个字段的值匹配指定字符串,该文件的信息就会被返回。

自然语言关键字查询

调用SemanticQuery - 通过输入自然语言关键字,对数据集内的元数据进行查询与统计分析接口可以通过输入自然语言关键字,对数据集内的元数据进行查询。

该接口目前支持的查询字段包括LabelsProduceTimeAddressLine。例如,需要查询包含杭州的天空的文件,您需要设置查询条件为Query=杭州的天空

查询单个指定文件信息

如下以查询项目test-project下,test-dataset数据集中oss://test-bucket/test-object.jpg文件的信息为例。

  • 请求示例

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

    {
        "RequestId": "645FB6D9-5EA0-02C9-B253-****",
        "Files": [
            {
                "ProduceTime": "2020-08-19T17:11:11+08:00",
                "ObjectACL": "default",
                "ContentType": "image/jpeg",
                "ProjectName": "test-project",
                "Size": 22868,
                "URI": "oss://test-bucket/test-object.jpg",
                "Addresses": [
                    {
                        "Language": "zh-Hans",
                        "Township": "塘沟镇",
                        "AddressLine": "江苏省宿迁市沭阳县塘沟镇陈龙庄",
                        "Country": "中国",
                        "City": "宿迁市",
                        "District": "沭阳县",
                        "Province": "江苏省"
                    }
                ],
                "ObjectType": "file",
                "CustomLabels": {
                    "category": "人物"
                },
                "OwnerId": "****",
                "FileModifiedTime": "2021-05-13T10:22:44+08:00",
                "ImageWidth": 270,
                "OSSStorageClass": "Standard",
                "MediaType": "image",
                "ObjectId": "****",
                "CreateTime": "2022-07-06T07:10:18.497753661+08:00",
                "Filename": "1.jpg",
                "Labels": [
                    {
                        "CentricScore": 0.921999990940094,
                        "Language": "zh-Hans",
                        "LabelConfidence": 1,
                        "LabelName": "发型",
                        "LabelLevel": 2,
                        "ParentLabelName": "日常行为"
                    },
                    ...
                ],
                "Orientation": 1,
                "Figures": [
                    {
                        "Beard": "none",
                        "MaskConfidence": 0.6959999799728394,
                        "Gender": "female",
                        "Boundary": {
                            "Left": 70,
                            "Top": 75,
                            "Height": 134,
                            "Width": 101
                        },
                        ...
                    }
                ],
                "EXIF": "...",
                "ContentMd5": "HZwoCnxPZ/fvhz4oRJ****",
                "ImageHeight": 270,
                "ImageScore": {
                    "OverallQualityScore": 0.6140000224113464
                },
                "ETag": "\"1D9C280A7C4F67F7EF873E28449D****\"",
                "DatasetName": "test-dataset",
                "FileHash": "\"1D9C280A7C4F67F7EF873E2****\"",
                "UpdateTime": "2022-07-06T07:10:18.497753661+08:00",
                "OSSCRC64": "5634447745650079669",
                "OSSTaggingCount": 0,
                "LatLong": "34.000000,119.000000",
                "OSSObjectType": "Normal"
            }
        ]
    }
  • 完整示例代码(以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_file_meta_request = imm_20200930_models.GetFileMetaRequest(
                project_name='test-project',
                dataset_name='test-dataset',
                uri='oss://test-bucket/test-object.jpg'
            )
            runtime = util_models.RuntimeOptions()
            try:
                # 打印API的返回值。
                response = client.get_file_meta_with_options(get_file_meta_request, runtime)
                print(response.body.to_map())
            except Exception as error:
                # 如有需要,请打印错误信息。
                UtilClient.assert_as_string(error.message)
                print(error)
    
    
    if __name__ == '__main__':
        Sample.main()

查询多个指定文件信息

如下以查询项目test-project下,test-dataset数据集中oss://test-bucket/test-object1.jpgoss://test-bucket/test-object2.jpg文件的信息为例。

  • 请求示例

    {
        "ProjectName": "test-project",
        "DatasetName": "test-dataset",
        "URIs": "[\"oss://test-bucket/test-object.jpg\", \"oss://test-bucket/test-object2.jpg\"]"
    }
  • 返回示例格式与查询单个指定文件信息相同。

  • 完整示例代码(以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_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)
            batch_get_file_meta_request = imm_20200930_models.BatchGetFileMetaRequest(
                project_name='test-project',
                dataset_name='test-dataset',
                uris=[
                    'oss://test-bucket/test-object1.jpg',
                    'oss://test-bucket/test-object2.jpg'
                ]
            )
            runtime = util_models.RuntimeOptions()
            try:
                # 打印API的返回值。
                response = client.batch_get_file_meta_with_options(batch_get_file_meta_request, runtime)
                print(response.body.to_map())
            except Exception as error:
                # 如有需要,请打印错误信息。
                UtilClient.assert_as_string(error.message)
                print(error)
    
    
    if __name__ == '__main__':
        Sample.main()

简单查询

示例一

查询条件如下。

  • 项目名称:test-project

  • 数据集名称:test-dataset

  • 查询文件类型:图片

  • 查询结果排序方式:按照文件大小升序排列

  • 查询结果最大返回数量:最多返回100条

查询示例如下。

  • 请求示例

    {
        "Query": "{\"Field\": \"ContentType\", \"Operation\": \"prefix\", \"Value\": \"image\"}",
        "ProjectName": "test-project",
        "DatasetName": "test-dataset"
        "Sort": "Size",
        "Order": "asc",
        "MaxResults": 100
    }
  • 返回示例格式与查询单个指定文件信息相同。

  • 完整示例代码(以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_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)
            request = imm_20200930_models.SimpleQueryRequest()
            params = {
                # 填写查询条件。
                "Query": {"SubQueries": [{"Field": "ContentType", "Operation": "eq", "Value": "image/jpeg"}, {"Field": "Size", "Operation": "gt", "Value": "10485760"}, {"Field": "CustomLabels.category", "Operation": "eq", "Value": "人物"}], "Operation": "and"},
                # 填写IMM项目名称
                "ProjectName": "test-project",
                # 填写数据集名称
                "DatasetName": "test-dataset",
                # 设置排序字段。
                "Sort": "Size",
                # 设置排序方式。
                "Order": "asc",
                # 设置最大返回值为100。
                "MaxResults": 100
            }
            request.from_map(params)
            runtime = util_models.RuntimeOptions()
            try:
                # 打印API的返回值。
                response = client.simple_query_with_options(request, runtime)
                print(response.body.to_map())
            except Exception as error:
                # 如有需要,请打印错误信息。
                UtilClient.assert_as_string(error.message)
                print(error)
    
    
    if __name__ == '__main__':
        Sample.main()

示例二

查询条件如下。

  • 项目名称:test-project

  • 数据集名称:test-dataset

  • 查询文件类型:图片

  • 查询文件大小:大于10 MB

  • 自定义标签(CustomLabels.category):人物

  • 查询结果排序方式:按照文件大小升序排列

  • 查询结果最大返回数量:最多返回100条

查询示例如下。

  • 请求示例

    {
        "Query": "{\"SubQueries\": [{\"Field\": \"ContentType\", \"Operation\": \"prefix\", \"Value\": \"image\"}, {\"Field\": \"Size\", \"Operation\": \"gt\", \"Value\": \"10485760\"}, {\"Field\": \"CustomLabels.category\", \"Operation\": \"eq\", \"Value\": \"人物\"}], \"Operation\": \"and\"}",
        "ProjectName": "test-project",
        "DatasetName": "test-dataset",
        "Sort": "Size",
        "Order": "asc",
        "MaxResults": 100
                            
  • 返回示例格式与查询单个指定文件信息相同。

示例三

查询条件如下。

  • 项目名称:test-project

  • 数据集名称:test-dataset

  • 查询文件路径:oss://test-bucket/

  • 查询文件大小:大于10 MB

  • 标签(Labels.LabelName):电视或音响

  • 查询结果排序方式:按照文件大小升序排列

  • 查询结果最大返回数量:最多返回100条

查询示例如下。

  • 请求示例

    {
        "Query": "{\"SubQueries\":[{\"Field\":\"URI\",\"Value\":\"oss://test-bucket/\",\"Operation\":\"prefix\"},{\"Field\":\"Size\",\"Value\":\"10485760\",\"Operation\":\"gt\"},{\"SubQueries\":[{\"Field\":\"Labels.LabelName\",\"Value\":\"电视\",\"Operation\":\"eq\"},{\"Field\":\"Labels.LabelName\",\"Value\":\"音响\",\"Operation\":\"eq\"}],\"Operation\":\"or\"}],\"Operation\":\"and\"}",
        "ProjectName": "test-project",
        "DatasetName": "test-dataset",
        "Sort": "Size",
        "Order": "asc",
        "MaxResults": 100
    }
  • 返回示例格式与查询单个指定文件信息相同。

示例四

查询条件如下。

  • 项目名称:test-project

  • 数据集名称:test-dataset

  • 查询文件类型:图片

  • 查询文件大小:大于10 MB

  • 自定义标签(CustomLabels.category):人物

  • 查询结果返回方式:统计总的文件大小

查询示例如下。

  • 请求示例

    {
        "Query": "{\"SubQueries\": [{\"Field\": \"ContentType\", \"Operation\": \"eq\", \"Value\": \"image/jpeg\"}, {\"Field\": \"Size\", \"Operation\": \"gt\", \"Value\": \"10485760\"}, {\"Field\": \"CustomLabels.category\", \"Operation\": \"eq\", \"Value\": \"人物\"}], \"Operation\": \"and\"}",
        "ProjectName": "test-project",
        "DatasetName": "test-dataset",
        "Aggregations": "[{\"Field\":\"Size\",\"Operation\":\"sum\"}]"
    }
  • 返回示例

    {
        "RequestId": "0FB9BA35-E16B-0DFE-BD52-****",
        "Aggregations": [
            {
                "Field": "Size",
                "Value": 10485760,
                "Operation": "sum"
            }
        ]
    }

示例五

查询条件如下。

  • 项目名称:test-project

  • 数据集名称:test-dataset

  • 查询文件大小:大于10 MB

  • 人脸(Figures.Age,Figures.Gender):年龄和性别

  • 查询结果排序方式:按照文件大小升序排列

  • 查询结果最大返回数量:最多返回100条

查询示例如下。

  • 请求示例

    {
        "Query": "{\"Operation\":\"not\",\"SubQueries\":[{\"Operation\":\"nested\",\"SubQueries\":[{\"Operation\":\"and\",\"SubQueries\":[{\"Field\":\"Figures.Age\",\"Operation\":\"gt\",\"Value\":\"36\"},{\"Field\":\"Figures.Gender\",\"Operation\":\"eq\",\"Value\":\"male\"},{\"Field\":\"Size\",\"Operation\":\"gt\",\"Value\":\"10485760\"}]}]}]}",
        "ProjectName": "test-project",
        "DatasetName": "test-dataset",
        "Sort": "Size",
        "Order": "asc",
        "MaxResults": 100
    }
  • 返回示例格式与查询单个指定文件信息相同。

示例六

查询条件如下。

  • 项目名称:test-project

  • 数据集名称:test-dataset

  • 查询文件类型:图片

  • 查询文件大小:大于10 MB

  • 自定义标签(CustomLabels.category):是否存在

  • 查询结果返回方式:统计总的文件大小

查询示例如下。

  • 请求示例

    {
        "Query": "{\"SubQueries\": [{\"Field\": \"ContentType\", \"Operation\": \"eq\", \"Value\": \"image/jpeg\"}, {\"Field\": \"Size\", \"Operation\": \"gt\", \"Value\": \"10485760\"}, {\"Field\": \"CustomLabels.category\", \"Operation\": \"exist\"}], \"Operation\": \"and\"}",
        "ProjectName": "test-project",
        "DatasetName": "test-dataset",
        "Aggregations": "[{\"Field\":\"Size\",\"Operation\":\"sum\"}]"
    }
  • 返回示例

    {
        "RequestId": "0FB9BA35-E16B-0DFE-BD52-****",
        "Aggregations": [
            {
                "Field": "Size",
                "Value": 10485760,
                "Operation": "sum"
            }
        ]
    }

模糊查询

如下以查询项目test-project下,test-dataset数据集中匹配字符串为jpg的文件为例。

  • 请求示例

    {
        "ProjectName": "test-project",
        "DatasetName": "test-dataset",
        "Query": "jpg"
    }
  • 返回示例格式与查询单个指定文件信息相同。

  • 完整示例代码(以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_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)
            fuzzy_query_request = imm_20200930_models.FuzzyQueryRequest(
                # 填写IMM项目名称。
                project_name='test-project',
                # 填写数据集名称。
                dataset_name='test-dataset',
                # 填写查询关键字。
                query='jpg'
            )
            runtime = util_models.RuntimeOptions()
            try:
                # 打印API的返回值。
                response = client.fuzzy_query_with_options(fuzzy_query_request, runtime)
                print(response.body.to_map())
            except Exception as error:
                # 如有需要,请打印错误信息。
                UtilClient.assert_as_string(error.message)
                print(error)
    
    
    if __name__ == '__main__':
        Sample.main()

自然语言关键字查询

如下以查询项目test-project下,test-dataset数据集中包含2020年7月成都的熊猫的文件为例。

  • 请求示例

    {
        "ProjectName": "test-project",
        "DatasetName": "test-dataset",
        "Query": "2020年7月成都的熊猫",
        "MaxResults": 100
    }
  • 返回示例格式与查询单个指定文件信息相同。

  • 完整示例代码(以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_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)
            semantic_query_request = imm_20200930_models.SemanticQueryRequest(
                query='2020年7月成都的熊猫',
                project_name='test-project',
                dataset_name='test-dataset',
                max_results=100
            )
            runtime = util_models.RuntimeOptions()
            try:
                # 打印API的返回值。
                response = client.semantic_query_with_options(semantic_query_request, runtime)
                print(response.body.to_map())
            except Exception as error:
                # 如有需要,请打印错误信息。
                UtilClient.assert_as_string(error.message)
                print(error)
    
    
    if __name__ == '__main__':
        Sample.main()