Si tienes una aplicación de búsqueda que usa datos estructurados o datos no estructurados con metadatos, puedes usar los metadatos para filtrar tus consultas de búsqueda. En esta página se explica cómo usar los campos de metadatos para limitar la búsqueda a un conjunto específico de documentos.
Antes de empezar
Asegúrate de haber creado una aplicación y de haber insertado datos estructurados o datos sin estructurar con metadatos. Para obtener más información, consulta el artículo Crear una aplicación de búsqueda.
Ejemplo de metadatos
Consulta este ejemplo de metadatos de cuatro archivos PDF (document_1.pdf
,
document_2.pdf
, document_3.pdf
y document_4.pdf
). Estos metadatos estarían en un archivo JSON de un bucket de Cloud Storage, junto con los archivos PDF. Puedes consultar este ejemplo mientras lees esta página.
{"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"}}
Sintaxis de las expresiones de filtro
Asegúrate de entender la sintaxis de la expresión de filtro que usarás para definir el filtro de búsqueda. La sintaxis de la expresión de filtro se puede resumir con la siguiente notación de Backus-Naur ampliada:
# 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.
Buscar con un filtro de metadatos
Para buscar con un filtro de metadatos, sigue estos pasos:
Determina el campo de metadatos que quieres usar para filtrar tus consultas de búsqueda.
Por ejemplo, en los metadatos de la sección Antes de empezar, puede usar el campo
category
como filtro de búsqueda. Cuando se filtran datos estructurados, como en el ejemplo de metadatos, se debe especificar la ruta completa del campo:structData.category
. De esta forma, los usuarios podrán filtrar porpersona_A
,persona_B
opersona_C
para que su búsqueda se limite a los documentos asociados al perfil que les interese.Hacer que el campo de metadatos sea indexable:
En la Google Cloud consola, ve a la página Aplicaciones de IA y, en el menú de navegación, haz clic en Aplicaciones.
Haz clic en tu aplicación de búsqueda.
En el menú de navegación, haga clic en Datos.
Haz clic en la pestaña Esquema. En esta pestaña se muestra la configuración actual de los campos.
Haz clic en Editar.
Seleccione la casilla Indexable (Indexable) del campo que quiera indexar.
Haz clic en Guardar. Para obtener más información, consulta Configurar los ajustes de los campos.
Busca el ID de tu almacén de datos. Si ya tiene el ID del almacén de datos, vaya al siguiente paso.
En la Google Cloud consola, ve a la página Aplicaciones de IA y, en el menú de navegación, haz clic en Almacenes de datos.
Haga clic en el nombre de su almacén de datos.
En la página Datos de su almacén de datos, obtenga el ID del almacén de datos.
Obtener resultados de búsqueda.
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" }'
Haz los cambios siguientes:
PROJECT_ID
: el ID de tu proyecto.DATA_STORE_ID
: el ID de tu almacén de datos.QUERY
: el texto de la consulta que se va a buscar.FILTER
: opcional. Campo de texto que le permite filtrar por un conjunto de campos específico mediante la sintaxis de la expresión de filtro. El valor predeterminado es una cadena vacía, lo que significa que no se aplica ningún filtro.
Por ejemplo, supongamos que has importado los cuatro archivos PDF con metadatos de la sección Antes de empezar. Quieres buscar documentos que contengan la palabra "reclamaciones" y solo consultar documentos con un valor de
category
depersona_A
. Para ello, debes incluir las siguientes declaraciones en tu llamada:"query": "claims", "filter": "structData.category: ANY(\"persona_A\")"
Para obtener más información, consulta la pestaña REST en Obtener resultados de búsqueda de una aplicación con datos estructurados o no estructurados.
Haz clic para ver un ejemplo de respuesta.
Si realizas una búsqueda como la del procedimiento anterior, puedes esperar obtener una respuesta similar a la siguiente. Fíjate en que la respuesta incluye los tres documentos que tienen el valor
category
depersona_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": {} }
Ejemplos de expresiones de filtro
En la siguiente tabla se muestran ejemplos de expresiones de filtro.
Filtro | Solo devuelve resultados de documentos en los que: |
---|---|
category: ANY("persona_A") |
el campo de texto category es persona_A |
score: IN(*, 100.0e) |
el campo numérico score es mayor que el infinito negativo y menor que 100,0 |
non-smoking = "true" |
el valor booleano non-smoking es true |
pet-friendly = "false" |
el valor booleano pet-friendly es false |
manufactured_date = "2023" |
manufactured date es cualquier momento del 2023 |
manufactured_date >= "2024-04-16" |
manufactured_date es igual o posterior al 16 de abril del 2024 |
manufactured_date < "2024-04-16T12:00:00-07:00" |
La manufactured_date es antes de las 12:00 (hora de verano del Pacífico) del 16 de abril del 2024 |
office.location:GEO_DISTANCE("1600 Amphitheater Pkwy, Mountain View, CA, 94043", 500) |
El campo de geolocalización office.location está a 500 m de 1600 Amphitheater Pkwy |
NOT office.location:GEO_DISTANCE("Palo Alto, CA", 1000) |
El campo de geolocalización office.location no está a 1 km de Palo Alto (California). |
office.location:GEO_DISTANCE(34.1829, -121.293, 500) |
El campo de geolocalización office.location está a un radio de 500 m de la latitud 34.1829 y la longitud -121.293. |
category: ANY("persona_A") AND score: IN(*, 100.0e) |
category es persona_A y score es inferior a 100 |
office.location:GEO_DISTANCE("Mountain View, CA", 500) OR office.location:GEO_DISTANCE("Palo Alto, CA", 500) |
office.location se encuentra a 500 m de Mountain View o Palo Alto. |
(price<175 AND pet-friendly = "true") OR (price<125 AND pet-friendly = "false") |
price es inferior a 175 y puedo llevar a mi mascota, o price es inferior a 125 y no puedo llevar a mi mascota |
Siguientes pasos
- Para entender el impacto de los filtros en la calidad de la búsqueda, evalúa la calidad de la búsqueda. Para obtener más información, consulta el artículo Evaluar la calidad de la búsqueda.