Filtrare la ricerca generica per dati strutturati o non strutturati

Se hai un'app di ricerca che utilizza dati strutturati o dati non strutturati con metadati, puoi utilizzare i metadati per filtrare le query di ricerca. Questa pagina spiega come utilizzare i campi dei metadati per limitare la ricerca a un insieme specifico di documenti.

Prima di iniziare

Assicurati di aver creato un'app e di aver importato dati strutturati o non strutturati con metadati. Per ulteriori informazioni, consulta Creare un'app di ricerca.

Esempio di metadati

Esamina questo esempio di metadati per quattro file PDF (document_1.pdf, document_2.pdf, document_3.pdf e document_4.pdf). Questi metadati si troverebbero in un file JSON in un bucket Cloud Storage, insieme ai file PDF. Puoi fare riferimento a questo esempio mentre leggi questa pagina.

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

Sintassi dell'espressione di filtro

Assicurati di comprendere la sintassi dell'espressione del filtro che utilizzerai per definire il filtro di ricerca. La sintassi dell'espressione di filtro può essere riassunta dalla seguente forma estesa Backus-Naur:

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

Eseguire ricerche utilizzando un filtro dei metadati

Per eseguire una ricerca utilizzando un filtro dei metadati:

  1. Determina il campo dei metadati da utilizzare per filtrare le query di ricerca. Ad esempio, per i metadati in Prima di iniziare, puoi utilizzare il campo category come filtro di ricerca. Gli utenti possono filtrare in base a persona_A, persona_B o persona_C, in modo che la loro ricerca sia limitata ai documenti associati alla persona che li interessa.

  2. Rendi indicizzato il campo dei metadati:

    1. Nella console Google Cloud, vai alla pagina Agent Builder e nel menu di navigazione fai clic su App.

      Vai alla pagina App

    2. Fai clic sulla tua app di ricerca.

    3. Nel menu di navigazione, fai clic su Dati.

    4. Fai clic sulla scheda Schema. Questa scheda mostra le impostazioni correnti dei campi.

    5. Fai clic su Modifica.

    6. Seleziona la casella di controllo Indicizzabile per il campo che vuoi indicizzare.

    7. Fai clic su Salva. Per ulteriori informazioni, consulta Configurare le impostazioni dei campi.

  3. Trova l'ID del tuo datastore. Se hai già l'ID del tuo datastore, vai al passaggio successivo.

    1. Nella console Google Cloud, vai alla pagina Agent Builder e nel menu di navigazione fai clic su Data Store.

      Vai alla pagina Datastore

    2. Fai clic sul nome del tuo datastore.

    3. Nella pagina Dati del tuo datastore, ottieni l'ID datastore.

  4. Visualizza i risultati di ricerca.

    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: l'ID del progetto.
    • DATA_STORE_ID: l'ID del tuo datastore.
    • QUERY: il testo della query da cercare.
    • FILTER: facoltativo. Un campo di testo che consente di filtrare in base a un insieme specificato di campi utilizzando la sintassi dell'espressione di filtro. Il valore predefinito è una stringa vuota, il che significa che non viene applicato alcun filtro.

    Ad esempio, supponiamo che tu abbia importato i quattro file PDF con i metadati da Prima di iniziare. Vuoi cercare i documenti che contengono la parola "richieste" ed eseguire query solo sui documenti con un valore category di persona_A. A tal fine, includi le seguenti dichiarazioni nella chiamata:

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

    Per saperne di più, consulta la scheda REST in Ottenere risultati di ricerca per un'app con dati strutturati o non strutturati.

    Fai clic per visualizzare un esempio di risposta.

    Se esegui una ricerca come quella descritta nella procedura precedente, puoi aspettarti di ricevere una risposta simile alla seguente. Tieni presente che la risposta include i tre documenti con un valore category di 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": {}
    }
    

Esempi di espressioni di filtro

La seguente tabella fornisce esempi di espressioni di filtro.

Filtro Restituisce risultati solo per i documenti in cui:
category: ANY(\"persona_A\") Il campo di testo category è persona_A
score: IN(*, 100.0e) Il campo numerico score è maggiore di infinito negativo e minore di 100,0
non-smoking = \"true\" il valore booleano non-smoking è true
pet-friendly = \"false\" il valore booleano pet-friendly è false
manufactured_date = \"2023\" manufactured date è un periodo qualsiasi del 2023
manufactured_date >= \"2024-04-16\" manufactured_date è successivo o uguale al 16 aprile 2024
manufactured_date < \"2024-04-16T12:00:00-07:00\" manufactured_date deve essere prima di mezzogiorno (ora legale del Pacifico USA) del 16 aprile 2024
office.location:GEO_DISTANCE(\"1600 Amphitheater Pkwy, Mountain View, CA, 94043\", 500) il campo di geolocalizzazione office.location si trova a una distanza massima di 500 m da 1600 Amphitheatre Pkwy
NOT office.location:GEO_DISTANCE(\"Palo Alto, CA\", 1000) Il campo di geolocalizzazione office.location non si trova nel raggio di 1 km da Palo Alto, in California.
office.location:GEO_DISTANCE(34.1829, -121.293, 500) Il campo di geolocalizzazione office.location si trova entro un raggio di 500 m dalla latitudine 34,1829 e dalla longitudine -121,293
category: ANY(\"persona_A\") AND score: IN(*, 100.0e) category è persona_A e score è inferiore a 100
office.location:GEO_DISTANCE(\"Mountain View, CA\", 500) OR office.location:GEO_DISTANCE(\"Palo Alto, CA\", 500) office.location si trova a una distanza massima di 500 m da Mountain View o Palo Alto.
(price<175 AND pet-friendly = \"true\") OR (price<125 AND pet-friendly = \"false\") price è inferiore a 175 e posso portare il mio animale domestico oppure price è inferiore a 125 e non posso portare il mio animale domestico

Passaggi successivi

  • Per comprendere l'impatto dei filtri sulla qualità della ricerca, valuta la qualità della ricerca. Per ulteriori informazioni, consulta Valutare la qualità della ricerca.