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.
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 di filtro che utilizzerai per definire il filtro di ricerca. La sintassi dell'espressione di filtro può essere riassunta dalla seguente forma di Backus-Naur estesa:
# 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.
Proprietà chiave che supportano il filtraggio
Anche se un campo della proprietà chiave è impostato su indicizzabile, potrebbe non supportare il filtraggio, le sfaccettature e l'ordinamento. Ad esempio, non puoi filtrare in base a un campo che esegue il mapping alla proprietà chiave title.
I seguenti campi delle proprietà chiave possono essere utilizzati per il filtraggio, le sfaccettature e il riordino.
Campi delle proprietà chiave per la ricerca personalizzata che possono essere utilizzati in filtri, sfaccettature e ordinamento:
CATEGORIES(category)CREATE_TIME(create_time)HASHTAGS(hashtag)LANGUAGE_CODE(language_code)UPDATE_TIME(update_time)URI(uri)
Campi delle proprietà chiave per la ricerca di contenuti multimediali che possono essere utilizzati in filtri, sfaccettature e ordinamento:
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)
Prima di iniziare
Assicurati di aver creato un'app e di aver importato dati strutturati o dati non strutturati con metadati. Per ulteriori informazioni, vedi Creare un'app di ricerca.
Eseguire la ricerca utilizzando un filtro di metadati
Per eseguire la ricerca utilizzando un filtro di metadati:
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
categorycampo come filtro di ricerca. Quando filtri i dati strutturati, come nell'esempio di metadati, specifica il percorso completo del campo:structData.category. Poi, gli utenti potrebbero filtrare in base apersona_A,persona_Bopersona_C, in modo che la ricerca sia limitata ai documenti associati alla persona a cui sono interessati.Rendi indicizzabile il campo dei metadati:
Nella Google Cloud console, vai alla pagina AI Applications e nel menu di navigazione, fai clic su App.
Fai clic sull'app di ricerca.
Nel menu di navigazione, fai clic su Dati.
Fai clic sulla scheda Schema. Questa scheda mostra le impostazioni dei campi correnti.
Fai clic su Modifica.
Seleziona la casella di controllo Indicizzabile per il campo che vuoi rendere indicizzabile.
Fai clic su Salva. Per ulteriori informazioni, vedi Configurare le impostazioni dei campi.
Trova l'ID app. Se hai già l'ID app, vai al passaggio successivo.
Nella Google Cloud console, vai alla pagina AI Applications.
Nella pagina App, trova il nome dell'app e recupera l'ID dell'app dalla colonna ID.
Ottieni i risultati di ricerca.
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" }'Sostituisci quanto segue:
PROJECT_ID: l'ID progetto.APP_ID: l'ID app.QUERY: il testo della query da cercare.FILTER: facoltativo. Un campo di testo che consente di filtrare 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 di aver importato i quattro file PDF con i metadati da Prima di iniziare. Vuoi cercare i documenti che contengono la parola "claims" ed eseguire query solo sui documenti con un valore
categorydipersona_A. Per farlo, includi le seguenti istruzioni nella chiamata:"query": "claims", "filter": "category: ANY(\"persona_A\")"Per ulteriori informazioni, vedi la scheda REST in Ottenere i risultati di ricerca per un'app con dati strutturati o non strutturati.
Fai clic per visualizzare una risposta di esempio.
Se esegui una ricerca come quella nella procedura precedente, puoi aspettarti di ricevere una risposta simile alla seguente. Tieni presente che la risposta include i tre documenti con un valore
categorydipersona_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 solo i risultati 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" |
la manufactured date è in qualsiasi momento del 2023 |
manufactured_date >= "2024-04-16" |
la manufactured_date è il 16 aprile 2024 o una data successiva |
manufactured_date < "2024-04-16T12:00:00-07:00" |
la manufactured_date è prima di mezzogiorno del 16 aprile 2024, ora legale del Pacifico |
office.location:GEO_DISTANCE("1600 Amphitheater Pkwy, Mountain View, CA, 94043", 500) |
il campo di geolocalizzazione office.location si trova a una distanza di 500 m da 1600 Amphitheater Pkwy |
NOT office.location:GEO_DISTANCE("Palo Alto, CA", 1000) |
il campo di geolocalizzazione office.location non si trova in un raggio di 1 km da Palo Alto, California. |
office.location:GEO_DISTANCE(34.1829, -121.293, 500) |
il campo di geolocalizzazione office.location si trova in 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 è minore di 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 di 500 m da Mountain View o Palo Alto. |
(price<175 AND pet-friendly = "true") OR (price<125 AND pet-friendly = "false") |
price è minore di 175 e posso portare il mio animale domestico oppure price è minore di 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, vedi Valutare la qualità della ricerca.