Cómo filtrar la búsqueda genérica de datos estructurados o no estructurados

Si tienes una app de búsqueda que usa datos estructurados o no estructurados con metadatos, puedes usarlos para filtrar tus búsquedas. Esta página explica cómo usar los campos de metadatos para restringir la búsqueda a un conjunto específico de documentos.

Antes de comenzar

Asegúrate de haber creado una app y transferido datos estructurados o datos no estructurados con metadatos. Para obtener más información, consulta Cómo crear una app de búsqueda.

Ejemplo de metadatos

Revisa este ejemplo de metadatos de cuatro archivos PDF (document_1.pdf, document_2.pdf, document_3.pdf y document_4.pdf). Estos metadatos se encontrarían en un archivo JSON en 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 la expresión de filtro

Asegúrate de comprender la sintaxis de la expresión de filtro que usarás para definir tu filtro de búsqueda. La sintaxis de la expresión de filtro se puede resumir con el siguiente formulario Extendedus-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.

Busca con un filtro de metadatos

Para buscar con un filtro de metadatos, sigue estos pasos:

  1. Determina el campo de metadatos que se usará para filtrar tus búsquedas. Para Por ejemplo, para los metadatos de Antes de comenzar, podrías Usa el campo category como filtro de búsqueda. Tus usuarios podrían filtrar por persona_A, persona_B o persona_C, de modo que su búsqueda se restrinja a los documentos asociados con el arquetipo que les interesa.

  2. Haz que el campo de metadatos sea indexable:

    1. En la consola de Google Cloud, ve a la página Agent Builder y, en el menú de navegación, haz clic en Apps.

      Ve a la página Apps

    2. Haz clic en tu app de búsqueda.

    3. En el menú de navegación, haz clic en Datos.

    4. Haz clic en la pestaña Esquema. En esta pestaña, se muestra la configuración actual del campo.

    5. Haz clic en Edit.

    6. Selecciona la casilla de verificación Indexable del campo que quieres crear. indexables.

    7. Haz clic en Guardar. Para obtener más información, consulta Define la configuración del campo.

  3. Busca el ID de tu almacén de datos. Si ya tienes el ID del almacén de datos, ve al siguiente paso.

    1. En la consola de Google Cloud, ve a la página Agent Builder y, en el menú de navegación, haz clic en Almacenes de datos.

      Ve a la página Almacenes de datos.

    2. Haz clic en el nombre de tu almacén de datos.

    3. En la página Datos de tu almacén de datos, obtén el ID del almacén de datos.

  4. Obtén 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"
    }'
    
    • PROJECT_ID: Es el ID del proyecto
    • DATA_STORE_ID: Es el ID de tu almacén de datos.
    • QUERY: Es el texto de la consulta que se buscará.
    • FILTER: Opcional un campo de texto que te permite filtrar según conjunto específico de campos, con las expresión de filtros sintaxis. El valor predeterminado es un campo string, lo que significa que no se aplica ningún filtro.

    Por ejemplo, supongamos que importaste los cuatro archivos PDF con metadatos de Antes de comenzar. Quieres buscar documentos que contener la palabra “reclamaciones” y solo consultar documentos con un valor category de persona_A Para ello, incluye las siguientes instrucciones con tu llamada:

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

    Para obtener más información, consulta la pestaña REST en Cómo obtener resultados de la búsqueda de una app 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 puedes esperar obtener una respuesta similar a la siguiente. Ten en cuenta que el incluye los tres documentos que tienen un category valor de 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": {}
    }
    

Ejemplos de expresiones de filtro

En la siguiente tabla, se proporcionan ejemplos de expresiones de filtro.

Filtro Solo muestra resultados de documentos en los siguientes casos:
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 verdadero
pet-friendly = \"false\" el valor booleano pet-friendly es falso
manufactured_date = \"2023\" manufactured date es en cualquier momento del 2023
manufactured_date >= \"2024-04-16\" El manufactured_date es igual o posterior al 16 de abril de 2024
manufactured_date < \"2024-04-16T12:00:00-07:00\" manufactured_date es antes del mediodía (hora de verano del Pacífico) del 16 de abril de 2024.
office.location:GEO_DISTANCE(\"1600 Amphitheater Pkwy, Mountain View, CA, 94043\", 500) el campo de geolocalización office.location se encuentra a una distancia de 500 m de 1600 Amphitheatre Pkwy
NOT office.location:GEO_DISTANCE(\"Palo Alto, CA\", 1000) el campo de ubicación geográfica office.location no se encuentra dentro de un radio de 1 km de Palo Alto, California.
office.location:GEO_DISTANCE(34.1829, -121.293, 500) el campo de geolocalización office.location se encuentra dentro de un radio de 500 m de latitud 34.1829 y 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 una distancia de 500 m de Mountain View o Palo Alto.
(price<175 AND pet-friendly = \"true\") OR (price<125 AND pet-friendly = \"false\") price tiene menos de 175 años y puedo traer a mi mascota, o price tiene menos de 125 y no puedo viajar con mi mascota

¿Qué sigue?

  • Para comprender el impacto de los filtros en la calidad de la búsqueda, evaluar la calidad de la búsqueda. Para obtener más información, consulta Evalúa la calidad de la búsqueda.