Filtrer la recherche personnalisée pour les données structurées ou non structurées

Si vous disposez d'une application de recherche qui utilise des données structurées ou des données non structurées avec des métadonnées, vous pouvez utiliser ces métadonnées pour filtrer vos requêtes de recherche. Cette page explique comment utiliser des champs de métadonnées pour limiter votre recherche à un ensemble spécifique de documents.

Exemple de métadonnées

Consultez cet exemple de métadonnées pour quatre fichiers PDF (document_1.pdf, document_2.pdf, document_3.pdf et document_4.pdf). Ces métadonnées se trouveraient dans un fichier JSON d'un bucket Cloud Storage, avec les fichiers PDF. Vous pouvez vous référer à cet exemple tout au long de cette page.

{"id": "1", "structData": {"title": "Policy on accepting corrected claims", "category": ["persona_A"]}, "content": {"mimeType": "application/pdf", "uri": "gs://bucketname_87654321/data/document_1.pdf"}}
{"id": "2", "structData": {"title": "Claims documentation and reporting guidelines for commercial members", "category": ["persona_A", "persona_B"]}, "content": {"mimeType": "application/pdf", "uri": "gs://bucketname_87654321/data/document_2.pdf"}}
{"id": "3", "structData": {"title": "Claims guidelines for bundled services and supplies for commercial members", "category": ["persona_B", "persona_C"]}, "content": {"mimeType": "application/pdf", "uri": "gs://bucketname_87654321/data/document_3.pdf"}}
{"id": "4", "structData": {"title": "Advantage claims submission guidelines", "category": ["persona_A", "persona_C"]}, "content": {"mimeType": "application/pdf", "uri": "gs://bucketname_87654321/data/document_4.pdf"}}

Syntaxe des expressions de filtre

Assurez-vous de bien comprendre la syntaxe de l'expression de filtre que vous utiliserez pour définir votre filtre de recherche. La syntaxe de l'expression de filtre peut être résumée au format EBNF étendu comme suit :

  # 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 exactly matches 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
    # An expression that applies to a geolocation field with text/street/postal address.
    |  geolocation_field, ":", "GEO_DISTANCE(", literal, ",", distance_in_meters, ")"
    # An expression that applies to a geolocation field with latitude and longitude.
    | geolocation_field, ":", "GEO_DISTANCE(", latitude_double, ",", longitude_double, ",", distance_in_meters, ")"
    # 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;
  geolocation_field = field of geolocation data type - for example home_address, location;
  datetime_field = field of datetime data type - for example creation_date, expires_on;
  literal_iso_8601_datetime_format = either a double quoted string representing ISO 8601 datetime or a numerical field representing microseconds from unix epoch.

Propriétés clés compatibles avec le filtrage

Même si un champ de propriété clé est défini comme indexable, il peut ne pas être compatible avec le filtrage, les facettes et le tri. Par exemple, vous ne pouvez pas filtrer un champ qui correspond à la propriété clé title.

Les champs de propriété clés suivants peuvent être utilisés pour le filtrage, les facettes et le réordonnancement.

Champs de propriété clés pour la recherche personnalisée pouvant être utilisés dans les filtres, les facettes et le tri :

  • CATEGORIES (category)
  • CREATE_TIME (create_time)
  • HASHTAGS (hashtag)
  • LANGUAGE_CODE (language_code)
  • UPDATE_TIME (update_time)
  • URI (uri)

Champs de propriété clés pour la recherche de médias pouvant être utilisés dans les filtres, les facettes et le tri :

  • MEDIA_AVAILABLE_TIME (media_available_time)
  • MEDIA_CONTENT_INDEX (media_content_index)
  • MEDIA_CONTENT_RATING (media_content_rating)
  • MEDIA_COUNTRY_OF_ORIGIN (media_country_of_origin)
  • MEDIA_DURATION (media_duration)
  • MEDIA_EXPIRE_TIME (media_expire_time)
  • MEDIA_FILTER_TAGS (media_filter_tag)
  • MEDIA_HASH_TAGS (media_hash_tag)
  • MEDIA_IN_LANGUAGES (media_in_language)
  • MEDIA_LIVE_EVENT_END_TIME (media_live_event_end_time)
  • MEDIA_LIVE_EVENT_START_TIME (media_live_event_start_time)
  • MEDIA_PRODUCTION_YEAR (media_production_year)
  • MEDIA_TYPE (media_type)

Avant de commencer

Assurez-vous d'avoir créé une application et ingéré des données structurées ou des données non structurées avec des métadonnées. Pour en savoir plus, consultez Créer une application de recherche.

Rechercher à l'aide d'un filtre de métadonnées

Pour effectuer une recherche à l'aide d'un filtre de métadonnées, procédez comme suit :

  1. Déterminez le champ de métadonnées à utiliser pour filtrer vos requêtes de recherche.

    Par exemple, pour les métadonnées de la section Avant de commencer, vous pouvez utiliser le champ category comme filtre de recherche. Lorsque vous filtrez des données structurées, comme dans l'exemple de métadonnées, spécifiez le chemin complet du champ : structData.category. Vos utilisateurs peuvent ensuite filtrer par persona_A, persona_B ou persona_C, de sorte que leur recherche soit limitée aux documents associés à la persona qui les intéresse.

  2. Rendez le champ de métadonnées indexable :

    1. Dans la Google Cloud console, accédez à la page AI Applications (Applications d'IA), puis cliquez sur Apps (Applications) dans le menu de navigation.

      Accéder à la page "Applications"

    2. Cliquez sur votre application de recherche.

    3. Dans le menu de navigation, cliquez sur Data (Données).

    4. Cliquez sur l'onglet Schema (Schéma). Cet onglet affiche les paramètres de champ actuels.

    5. Cliquez sur Edit (Modifier).

    6. Cochez la case Indexable (Indexable) pour le champ que vous souhaitez rendre indexable.

    7. Cliquez sur Save (Enregistrer). Pour en savoir plus, consultez Configurer les paramètres de champ.

  3. Trouvez l'ID de votre application. Si vous disposez déjà de l'ID de votre application, passez à l'étape suivante.

    1. Dans la Google Cloud console, accédez à la page AI Applications (Applications d'IA).

      Accédez à "Applications".

    2. Sur la page Apps (Applications), recherchez le nom de votre application et récupérez son ID dans la colonne ID.

  4. Obtenez les résultats de recherche.

    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"
    }'
    

    Remplacez les éléments suivants :

    • PROJECT_ID : par l'ID du projet.
    • APP_ID : par l'ID de l'application.
    • QUERY : par le texte de la requête à rechercher.
    • FILTER : facultatif. Champ de texte qui vous permet de filtrer un ensemble de champs spécifié à l'aide de la syntaxed'expression de filtre. La valeur par défaut est une chaîne vide, ce qui signifie qu'aucun filtre n'est appliqué.

    Supposons que vous ayez importé les quatre fichiers PDF avec des métadonnées de la section Avant de commencer. Vous souhaitez rechercher les documents contenant le mot "claims" (réclamations) et interroger uniquement les documents dont la valeur category est persona_A. Pour ce faire, incluez les instructions suivantes dans votre appel :

    "query": "claims",
    "filter": "category: ANY(\"persona_A\")"
    

    Pour en savoir plus, consultez l'onglet REST de la section Obtenir les résultats de recherche pour une application avec des données structurées ou non structurées.

    Cliquez pour obtenir un exemple de réponse.

    Si vous effectuez une recherche comme celle de la procédure précédente, vous pouvez vous attendre à obtenir une réponse semblable à la suivante. Notez que la réponse inclut les trois documents dont la valeur category est persona_A.

    {
    "results": [
    {
      "id": "2",
      "document": {
        "name": "projects/abcdefg/locations/global/collections/default_collection/dataStores/search_store_id/branches/0/documents/2",
        "id": "2",
        "structData": {
          "title": "Claims documentation and reporting guidelines for commercial members",
          "category": [
            "persona_A",
            "persona_B"
          ]
        },
        "derivedStructData": {
          "link": "gs://bucketname_87654321/data/document_2.pdf",
          "extractive_answers": [
            {
              "pageNumber": "1",
              "content": "lorem ipsum"
            }
          ]
        }
      }
    },
    {
      "id": "1",
      "document": {
        "name": "projects/abcdefg/locations/global/collections/default_collection/dataStores/search_store_id/branches/0/documents/1",
        "id": "1",
        "structData": {
          "title": "Policy on accepting corrected claims",
          "category": [
            "persona_A"
          ]
        },
        "derivedStructData": {
          "extractive_answers": [
            {
              "pageNumber": "2",
              "content": "lorem ipsum"
            }
          ],
          "link": "gs://bucketname_87654321/data/document_1.pdf"
        }
      }
    },
    {
      "id": "4",
      "document": {
        "name": "projects/abcdefg/locations/global/collections/default_collection/dataStores/search_store_id/branches/0/documents/4",
        "id": "4",
        "structData": {
          "title": "Advantage claims submission guidelines",
          "category": [
            "persona_A",
            "persona_C"
          ]
        },
        "derivedStructData": {
          "extractive_answers": [
            {
              "pageNumber": "47",
              "content": "lorem ipsum"
            }
          ],
          "link": "gs://bucketname_87654321/data/document_4.pdf"
        }
      }
    }
    ],
    "totalSize": 330,
    "attributionToken": "UvBRCgsI26PxpQYQs7vQZRIkNjRiYWY1MTItMDAwMC0yZWIwLTg3MTAtMTQyMjNiYzYzMWEyIgdHRU5FUklDKhSOvp0VpovvF8XL8xfC8J4V1LKdFQ",
    "guidedSearchResult": {},
    "summary": {}
    }
    

Exemples d'expressions de filtre

Le tableau suivant fournit des exemples d'expressions de filtre.

Filtre Ne renvoie des résultats que pour les documents où :
category: ANY("persona_A") le champ de texte category est persona_A
score: IN(*, 100.0e) le champ numérique score est supérieur à l'infini négatif et inférieur à 100,0
non-smoking = "true" le champ booléen non-smoking est "true"
pet-friendly = "false" le champ booléen pet-friendly est "false"
manufactured_date = "2023" la manufactured date (date de fabrication) est n'importe quand en 2023
manufactured_date >= "2024-04-16" la manufactured_date est le 16 avril 2024 ou une date ultérieure
manufactured_date < "2024-04-16T12:00:00-07:00" la manufactured_date est antérieure au 16 avril 2024 à midi, heure d'été du Pacifique
office.location:GEO_DISTANCE("1600 Amphitheater Pkwy, Mountain View, CA, 94043", 500) le champ de géolocalisation office.location se trouve à moins de 500 m de 1600 Amphitheater Pkwy
NOT office.location:GEO_DISTANCE("Palo Alto, CA", 1000) le champ de géolocalisation office.location ne se trouve pas dans un rayon de 1 km de Palo Alto, en Californie.
office.location:GEO_DISTANCE(34.1829, -121.293, 500) le champ de géolocalisation office.location se trouve dans un rayon de 500 m de la latitude 34,1829 et de la longitude -121,293
category: ANY("persona_A") AND score: IN(*, 100.0e) category est persona_A et score est inférieur à 100
office.location:GEO_DISTANCE("Mountain View, CA", 500) OR office.location:GEO_DISTANCE("Palo Alto, CA", 500) office.location se trouve à moins de 500 m de Mountain View ou de Palo Alto.
(price<175 AND pet-friendly = "true") OR (price<125 AND pet-friendly = "false") price est inférieur à 175 et je peux emmener mon animal de compagnie, ou price est inférieur à 125 et je ne peux pas emmener mon animal de compagnie

Étape suivante