Filtre a pesquisa personalizada por dados estruturados ou não estruturados

Se tiver uma app de pesquisa que use dados estruturados ou dados não estruturados com metadados, pode usar os metadados para filtrar as suas consultas de pesquisa. Esta página explica como usar campos de metadados para restringir a pesquisa a um conjunto específico de documentos.

Antes de começar

Certifique-se de que criou uma app e carregou dados estruturados ou dados não estruturados com metadados. Para mais informações, consulte o artigo Crie uma app de pesquisa.

Exemplo de metadados

Reveja este exemplo de metadados para quatro ficheiros PDF (document_1.pdf, document_2.pdf, document_3.pdf e document_4.pdf). Estes metadados estariam num ficheiro JSON num contentor do Cloud Storage, juntamente com os ficheiros PDF. Pode consultar este exemplo à medida que lê 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"}}

Sintaxe das expressões de filtro

Certifique-se de que compreende a sintaxe da expressão de filtro que vai usar para definir o filtro de pesquisa. A sintaxe da expressão de filtro pode ser resumida pela seguinte forma Backus-Naur alargada:

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

Pesquise através de um filtro de metadados

Para pesquisar através de um filtro de metadados, siga estes passos:

  1. Determine o campo de metadados a usar para filtrar as suas consultas de pesquisa.

    Por exemplo, para os metadados em Antes de começar, pode usar o campo category como filtro de pesquisa. Quando filtrar dados estruturados, como no exemplo de metadados, especifique o caminho completo para o campo: structData.category. Em seguida, os utilizadores podem filtrar por persona_A, persona_B ou persona_C, para que a pesquisa seja restrita aos documentos associados à personagem que lhes interessa.

  2. Tornar o campo de metadados indexável:

    1. Na Google Cloud consola, aceda à página Aplicações de IA e, no menu de navegação, clique em Apps.

      Aceda à página Apps

    2. Clique na sua app de pesquisa.

    3. No menu de navegação, clique em Dados.

    4. Clique no separador Esquema. Este separador mostra as definições de campo atuais.

    5. Clique em Edit.

    6. Selecione a caixa de verificação Indexável para o campo que quer tornar indexável.

    7. Clique em Guardar. Para mais informações, consulte o artigo Configure as definições dos campos.

  3. Encontre o ID da loja de dados. Se já tiver o ID do armazenamento de dados, avance para o passo seguinte.

    1. Na Google Cloud consola, aceda à página Aplicações de IA e, no menu de navegação, clique em Armazenamentos de dados.

      Aceda à página Armazenamentos de dados

    2. Clique no nome do seu arquivo de dados.

    3. Na página Dados da sua loja de dados, obtenha o ID da loja de dados.

  4. Receber resultados da pesquisa.

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

    Substitua o seguinte:

    • PROJECT_ID: o ID do seu projeto.
    • DATA_STORE_ID: o ID do seu armazenamento de dados.
    • QUERY: o texto da consulta a pesquisar.
    • FILTER: opcional. Um campo de texto que lhe permite filtrar um conjunto de campos especificado através da sintaxe de expressão de filtro. O valor predefinido é uma string vazia, o que significa que não é aplicado nenhum filtro.

    Por exemplo, suponhamos que importou os quatro ficheiros PDF com metadados da secção Antes de começar. Quer pesquisar documentos que contenham a palavra "reivindicações" e consultar apenas documentos com um valor de category de persona_A. Pode fazê-lo incluindo as seguintes declarações na sua chamada:

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

    Para mais informações, consulte o separador REST em Obtenha resultados da pesquisa para uma app com dados estruturados ou não estruturados.

    Clique para ver uma resposta de exemplo.

    Se fizer uma pesquisa como a do procedimento anterior, pode esperar receber uma resposta semelhante à seguinte. Tenha em atenção que a resposta inclui os três documentos que têm um valor de categorypersona_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": {}
    }
    

Exemplos de expressões de filtro

A tabela seguinte apresenta exemplos de expressões de filtro.

Filtro Só devolve resultados para documentos em que:
category: ANY("persona_A") o campo de texto category é persona_A
score: IN(*, 100.0e) O campo numérico score é superior a infinito negativo e inferior a 100,0
non-smoking = "true" o valor booleano non-smoking é verdadeiro
pet-friendly = "false" O valor booleano pet-friendly é falso
manufactured_date = "2023" o manufactured date for em qualquer altura de 2023
manufactured_date >= "2024-04-16" A data de início da subscrição é igual ou posterior a 16 de abril de 2024manufactured_date
manufactured_date < "2024-04-16T12:00:00-07:00" O manufactured_date for antes das 12:00 (Hora Legal do Pacífico) a 16 de abril de 2024
office.location:GEO_DISTANCE("1600 Amphitheater Pkwy, Mountain View, CA, 94043", 500) O campo de geolocalização office.location está a uma distância de 500 m de 1600 Amphitheater Pkwy
NOT office.location:GEO_DISTANCE("Palo Alto, CA", 1000) O campo de geolocalização office.location não está num raio de 1 km de Palo Alto, Califórnia.
office.location:GEO_DISTANCE(34.1829, -121.293, 500) O campo de geolocalização office.location está num raio de 500 m da latitude 34,1829 e da longitude -121,293
category: ANY("persona_A") AND score: IN(*, 100.0e) category é persona_A e score é inferior a 100
office.location:GEO_DISTANCE("Mountain View, CA", 500) OR office.location:GEO_DISTANCE("Palo Alto, CA", 500) office.location está a uma distância de 500 m de Mountain View ou Palo Alto.
(price<175 AND pet-friendly = "true") OR (price<125 AND pet-friendly = "false") price é inferior a 175 e posso levar o meu animal de estimação, ou price é inferior a 125 e não posso levar o meu animal de estimação

O que se segue?

  • Para compreender o impacto dos filtros na qualidade da pesquisa, avalie a qualidade da pesquisa. Para mais informações, consulte Avalie a qualidade da pesquisa.