미디어 검색 필터링

미디어 검색 앱이 있는 경우 메타데이터를 사용하여 검색어를 필터링할 수 있습니다. 이 페이지에서는 메타데이터 필드를 사용하여 검색을 특정 문서 집합으로 제한하는 방법을 설명합니다.

시작하기 전에

미디어 앱과 데이터 스토어를 만들고 데이터를 수집했는지 확인합니다. 자세한 내용은 미디어 데이터 스토어 만들기미디어 앱 만들기를 참고하세요.

예시 문서

다음 미디어 예시 문서를 검토하세요. 이 페이지를 읽으면서 다시 참고할 수 있습니다.

{"id":"172851","schemaId":"default_schema","jsonData":"{\"title\":\"Avatar: Creating the World of Pandora (2010)\",\"categories\":[\"Documentary\"],\"uri\":\"http://mytestdomain.movie/content/172851\",\"available_time\":\"2023-01-01T00:00:00Z\",\"media_type\":\"movie\"}"}
{"id":"243308","schemaId":"default_schema","jsonData":"{\"title\":\"Capturing Avatar (2010)\",\"categories\":[\"Documentary\"],\"uri\":\"http://mytestdomain.movie/content/243308\",\"available_time\":\"2023-01-01T00:00:00Z\",\"media_type\":\"movie\"}"}
{"id":"280218","schemaId":"default_schema","jsonData":"{\"title\":\"Avatar: The Way of Water (2022)\",\"categories\":[\"Action\",\"Adventure\",\"Sci-Fi\"],\"uri\":\"http://mytestdomain.movie/content/280218\",\"available_time\":\"2023-01-01T00:00:00Z\",\"media_type\":\"movie\"}"}
{"id":"72998","schemaId":"default_schema","jsonData":"{\"title\":\"Avatar (2009)\",\"categories\":[\"Action\",\"Adventure\",\"Sci-Fi\",\"IMAX\"],\"uri\":\"http://mytestdomain.movie/content/72998\",\"available_time\":\"2023-01-01T00:00:00Z\",\"media_type\":\"movie\"}"}

필터 표현식 구문

검색 필터를 정의하는 데 사용할 필터 표현식 구문을 이해해야 합니다. 필터 표현식 구문은 다음 Extended Backus–Naur Form으로 요약할 수 있습니다.

  # A single expression or multiple expressions that are joined by "AND" or "OR".
  filter = expression, { " AND " | "OR", expression };
  # Expressions can be prefixed with "-" or "NOT" to express a negation.
  expression = [ "-" | "NOT " ],
    # A parenthetical expression.
    | "(", expression, ")"
    # A simple expression applying to a text field.
    # Function "ANY" returns true if the field contains any of the literals.
    ( text_field, ":", "ANY", "(", literal, { ",", literal }, ")"
    # A simple expression applying to a numerical field. Function "IN" returns true
    # if a field value is within the range. By default, lower_bound is inclusive and
    # upper_bound is exclusive.
    | numerical_field, ":", "IN", "(", lower_bound, ",", upper_bound, ")"
    # A simple expression that applies to a numerical field and compares with a double value.
    | numerical_field, comparison, double );
    # Datetime field
    | datetime_field, comparison, literal_iso_8601_datetime_format);
  # A lower_bound is either a double or "*", which represents negative infinity.
  # Explicitly specify inclusive bound with the character 'i' or exclusive bound
  # with the character 'e'.
  lower_bound = ( double, [ "e" | "i" ] ) | "*";
  # An upper_bound is either a double or "*", which represents infinity.
  # Explicitly specify inclusive bound with the character 'i' or exclusive bound
  # with the character 'e'.
  upper_bound = ( double, [ "e" | "i" ] ) | "*";
  # Supported comparison operators.
  comparison = "<=" | "<" | ">=" | ">" | "=";
  # A literal is any double quoted string. You must escape backslash (\) and
  # quote (") characters.
  literal = double quoted string;
  text_field = text field - for example, category;
  numerical_field = numerical field - for example, score;
  datetime_field = field of datetime data type - for example available_time;
  literal_iso_8601_datetime_format = either a double quoted string representing ISO 8601 datetime or a numerical field representing microseconds from unix epoch.

메타데이터를 사용하여 미디어 검색을 필터링하려면 다음 단계를 따르세요.

  1. 앱 ID를 찾습니다. 앱 ID를 이미 알고 있는 경우 다음 단계로 건너뜁니다.

    1. Google Cloud 콘솔에서 AI 애플리케이션 페이지로 이동합니다.

      앱으로 이동

    2. 페이지에서 앱 이름을 찾고 ID 열에서 앱 ID를 가져옵니다.

  2. 필터링할 문서 필드를 결정합니다. 예를 들어 시작하기 전에의 문서에서는 categories 필드를 필터로 사용할 수 있습니다.

    필터 표현식에서는 색인 생성 가능한 필드만 사용할 수 있습니다. 색인을 생성할 수 있는 필드인지 확인하려면 다음 안내를 따르세요.

    1. Google Cloud 콘솔에서 AI 애플리케이션 페이지로 이동하고 탐색 메뉴에서 데이터 스토어를 클릭합니다.

      데이터 스토어 페이지로 이동

    2. 데이터 스토어 이름을 클릭합니다.

    3. 이름 열에서 데이터 스토어를 클릭합니다.

    4. 스키마 탭을 클릭하여 데이터 스토어의 스키마를 확인합니다. 필드의 색인 생성 가능이 다음과 같은 경우:

      • 선택됨 인 경우 검색을 위해 해당 필드를 필터링할 수 있습니다. 3단계를 건너뜁니다.

      • 선택되지 않음 인 경우 3단계를 따라 필드의 색인 생성을 사용 설정합니다.

      • 사용할 수 없음 인 경우 필드의 색인을 생성할 수 없습니다.

  3. categories 필드 등의 필드를 필터링할 수 있도록 만들려면 다음 안내를 따르세요.

    1. Google Cloud 콘솔에서 AI 애플리케이션 페이지로 이동하고 탐색 메뉴에서 을 클릭합니다.

      앱 페이지로 이동

    2. 미디어 검색 앱을 클릭합니다.

    3. 탐색 메뉴에서 데이터를 클릭합니다.

    4. 스키마 탭을 클릭합니다. 이 탭에는 현재 필드 설정이 표시됩니다.

    5. 수정을 클릭합니다.

    6. 아직 선택되지 않았으면 카테고리 행에서 색인 생성 가능 체크박스를 선택한 다음 저장을 클릭합니다.

    7. 스키마 수정사항이 전파될 때까지 6시간 정도 기다립니다. 6시간이 지나면 다음 단계를 진행할 수 있습니다.

  4. 검색 결과를 가져옵니다.

    curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/servingConfigs/default_search:search" \
    -d '{
    "query": "QUERY",
    "filter": "FILTER"
    }'
    

    다음을 바꿉니다.

    • PROJECT_ID: 프로젝트의 ID입니다.
    • APP_ID: 앱의 ID입니다.
    • QUERY: 검색할 쿼리 텍스트입니다.
    • FILTER: 필터 표현식을 사용하여 검색을 필터링하기 위한 텍스트 필드입니다.

    예를 들어 시작하기 전에 섹션의 영화를 검색하려고 하는데 (1) '아바타'라는 단어가 포함되어 있고 (2) '다큐멘터리' 카테고리에 있는 영화에 대한 검색 결과만 반환되도록 해야 한다고 가정해 보겠습니다. 호출에 다음 문을 포함하면 됩니다.

    "query": "avatar",
    "filter": "categories: ANY(\"Documentary\")"
    

    자세한 내용은 search 메서드를 참조하세요.

    클릭하여 응답 예시를 확인하세요.

    위의 절차와 같이 검색을 수행하면 다음과 유사한 응답이 표시됩니다. 응답에 아바타 다큐멘터리만 포함되어 있습니다.

    {
      "results": [
        {
          "id": "243308",
          "document": {
            "name": "projects/431678329718/locations/global/collections/default_collection/dataStores/rdds3_1698205785399/branches/0/documents/243308",
            "id": "243308",
            "structData": {
              "categories": [
                "Documentary"
              ],
              "title": "Capturing Avatar (2010)",
              "uri": "http://mytestdomain.movie/content/243308",
              "media_type": "movie"
            }
          }
        },
        {
          "id": "172851",
          "document": {
            "name": "projects/431678329718/locations/global/collections/default_collection/dataStores/rdds3_1698205785399/branches/0/documents/172851",
            "id": "172851",
            "structData": {
              "categories": [
                "Documentary"
              ],
              "uri": "http://mytestdomain.movie/content/172851",
              "media_type": "movie",
              "title": "Avatar: Creating the World of Pandora (2010)"
            }
          }
        }
      ],
      "totalSize": 2,
      "attributionToken": "XfBcCgwIvIzJqwYQ2_qNxwMSJDY1NzEzNmY1LTAwMDAtMmFhMy05YWU3LTE0MjIzYmIwOGVkMiIFTUVESUEqII6-nRXFy_MXnIaOIsLwnhXUsp0VpovvF6OAlyKiho4i",
      "guidedSearchResult": {},
      "summary": {}
    }

사용 가능한 문서 필터링

검색 결과에 사용 가능한 문서만 반환되도록 하려면 쿼리에 이 필터를 포함해야 합니다. 사용 가능한 문서는 available_time가 과거에 있고 expire_time가 지정되지 않았거나 미래 날짜로 설정된 문서입니다.

현재 사용 가능한 문서만 반환하도록 필터링합니다.

  available_time <= \"DATE_TIME\" AND expire_time > \"DATE_TIME\"

DATE_TIME을 오늘 날짜로 바꿉니다(예: 2025-04-21 또는 2025-04-21T00:00:00Z).

평점, 사용자, 조직 필터

미디어 등급, 개인, 조직의 필터 구문은 고유하며 위의 패턴을 따르지 않습니다. 다음 예시와 복사 가능한 필터 스니펫을 사용하여 평가, 인물, 조직에 대한 필터를 만드세요.

필터는 Google 사전 정의 스키마를 사용하는지 아니면 자체 맞춤 스키마를 사용하는지에 따라 다릅니다.

평점, 사람, 조직 필터 (Google 사전 정의 스키마)

평점, 개인, 조직 필터의 문법과 예시는 다음과 같습니다.

  • 등급 필터링: 지정된 소스의 등급을 기준으로 필터링합니다.

     rating(RATING_SOURCE, aggregate_ratings.rating_score) OPERATOR RATING_SCORE
    

    다음을 바꿉니다.

    • RATING_SOURCE: 평가의 소스입니다. 사전 정의된 스키마의 경우 aggregate_ratings.rating_source 필드의 값입니다.

    • OPERATOR: 비교 연산자(<=, <, >=, > 또는 =) 중 하나

    • RATING_SCORE: [1,5] 범위의 평가 값입니다. 사전 정의된 스키마의 경우 aggregate_ratings.rating_score 필드의 값입니다.

    예: 이 필터는 IMDB 평점이 2½개를 초과하는 영화로 검색을 제한합니다. 괄호 안의 값은 IMDB 등급 값으로 확인됩니다.

    "filter": "rating(imdb, aggregate_ratings.rating_score) > 2.5"
    
  • 사용자 필터링: 지정된 역할의 사용자 이름을 필터링합니다.

    person(PERSONS_ROLE, persons.name): ANY NAME_STRING
    

    다음을 바꿉니다.

    • PERSONS_ROLE: 사전 정의된 스키마의 경우 persons.role 필드의 값입니다 (director, actor, player, team, league, editor, author, character, contributor, creator, editor, funder, producer, provider, publisher, sponsor, translator, music-by, channel 또는 custom-role).

    • NAME_STRING: 지정된 역할을 가진 사람의 이름입니다. 4단계와 같은 curl 명령어의 경우 큰따옴표를 백슬래시 문자로 이스케이프해야 합니다.

    예: 이 필터는 배우 중 한 명이 브래드 피트 또는 케이트 윈슬렛인 영화로 검색을 제한합니다.

    filter: "person(actor, persons.name): ANY(\"Brad Pitt\", \"Kate Winslet\")"
    
  • 조직 필터링: 지정된 역할의 조직 이름을 기준으로 필터링합니다.

    org(ORG_ROLE, organization.name): ANY NAME_STRING
    

    다음을 바꿉니다.

    • ORG_ROLE: 사전 정의된 스키마의 경우 organizations.role 필드의 값입니다 (director, actor, player, team, league, editor, author, character, contributor, creator, editor, funder, producer, provider, publisher, sponsor, translator, music-by, channel 또는 custom-role).

    • NAME_STRING: 지정된 역할이 있는 조직의 이름입니다(하나 이상). 4단계와 같은 curl 명령어의 경우 큰따옴표를 백슬래시 문자로 이스케이프 처리해야 합니다.

    이 예에서는 제작 조직이 Walt Disney Studios인 영화로 검색을 제한합니다.

    filter: "org(producer, organizations.name): ANY(\"Walt Disney Studios\")"
    

평점, 사용자, 조직 필터 (맞춤 스키마)

맞춤 스키마를 사용하는 경우 Google 사전 정의 스키마 섹션과 이 섹션의 예시를 검토하세요. 맞춤 스키마에서 평가, 개인, 조직 필터가 작동하려면 속성 매핑이 올바르게 설정되어야 합니다. 속성 매핑에 대한 자세한 내용은 맞춤 스키마를 참고하세요.

필터 매핑할 속성
rating media_aggregated_rating
media_aggregated_rating_score
media_aggregated_rating_source
사람 media_person
media_person_name
media_person_role
조직 media_organization
media_organization_name
media_organization_role

맞춤 스키마의 평점 필터 예

이 필터는 Rotten Tomatoes에서 별점 5개를 받은 영화를 검색합니다.

"filter": "rating(rotten_tomatoes, custom_rating.star_score) = 5"

rotten_tomatoesmedia_aggregated_rating_source에 매핑된 필드의 값입니다. custom_rating.star_scoremedia_aggregated_rating.media_aggregated_rating_score 키 속성에 매핑된 필드입니다.

맞춤 스키마의 조직 필터 예

이 필터는 런던 심포니 오케스트라 또는 할리우드 스튜디오 심포니가 음악을 담당한 영화를 검색합니다.

"filter: org(music-by, company.id): ANY (\"London Symphony Orchestra\", \"Hollywood Studio Symphony\" )

company.idmedia_organization_name 속성에 매핑된 필드의 이름입니다. music-bymedia_organization_role에 매핑되는 회사 레코드 필드의 값입니다.