Filtrer une recherche générique pour des 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 les métadonnées pour filtrer vos requêtes de recherche. Cette page explique comment utiliser les champs de métadonnées pour limiter votre recherche à un ensemble de documents spécifique.

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 la page Créer une application de recherche.

Exemple de métadonnées

Examinez 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 dans un bucket Cloud Storage, avec les fichiers PDF. Vous pouvez vous reporter à cet exemple lorsque vous lisez 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 par la forme Backus-Naur étendue suivante:

  # 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.

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. Vos utilisateurs peuvent filtrer sur persona_A, persona_B ou persona_C. Leur recherche est donc limitée aux documents associés au persona qui les intéresse.

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

    1. Dans la console Google Cloud, accédez à la page Agent Builder, puis dans le menu de navigation, cliquez sur Applications.

      Accéder à la page "Applications"

    2. Cliquez sur votre application de recherche.

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

    4. Cliquez sur l'onglet Schéma. Cet onglet affiche les paramètres actuels des champs.

    5. Cliquez sur Modifier.

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

    7. Cliquez sur Enregistrer. Pour en savoir plus, consultez la section Configurer les paramètres des champs.

  3. Recherchez l'ID de votre data store. Si vous disposez déjà de l'ID de votre data store, passez à l'étape suivante.

    1. Dans la console Google Cloud, accédez à la page Agent Builder et cliquez sur Data Stores dans le menu de navigation.

      Accéder à la page "Datastores"

    2. Cliquez sur le nom de votre data store.

    3. Sur la page Données de votre data store, obtenez l'ID du data store.

  4. Obtenir 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/v1beta/projects/PROJECT_ID/locations/global/collections/default_collection/dataStores/DATA_STORE_ID/servingConfigs/default_search:search" \
    -d '{
    "query": "QUERY",
    "filter": "FILTER"
    }'
    
    • PROJECT_ID : ID de votre projet.
    • DATA_STORE_ID: ID de votre data store.
    • QUERY: texte de la requête à rechercher.
    • FILTER : facultatif. Champ de texte qui vous permet de filtrer sur un ensemble de champs spécifié à l'aide de la syntaxe d'expression de filtre. La valeur par défaut est une chaîne vide, ce qui signifie qu'aucun filtre n'est appliqué.

    Par exemple, supposons que vous ayez importé les quatre fichiers PDF avec des métadonnées de la section Avant de commencer. Vous souhaitez rechercher des documents contenant le mot "claims" et n'interroger que les documents dont la valeur category est persona_A. Pour ce faire, incluez les instructions suivantes avec votre appel:

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

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

    Cliquez pour voir un exemple de réponse.

    Si vous effectuez une recherche comme celle de la procédure précédente, vous devriez 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.

Filter Ne renvoie que les résultats 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\" la valeur booléenne non-smoking est "true"
pet-friendly = \"false\" La valeur booléenne pet-friendly est "false"
manufactured_date = \"2023\" manufactured date est une date quelconque en 2023
manufactured_date >= \"2024-04-16\" la valeur du champ manufactured_date correspond ou est ultérieure au 16 avril 2024 ;
manufactured_date < \"2024-04-16T12:00:00-07:00\" l'manufactured_date est avant midi, heure avancée du Pacifique, le 16 avril 2024 ;
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 Amphitheatre Parkway.
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