Filtrar a pesquisa genérica de dados estruturados ou não estruturados

Se você tem um app de pesquisa que usa dados estruturados ou não estruturados com metadados, você pode usá-los para filtrar 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

Verifique se você criou um app e consumiu dados estruturados ou não estruturados com metadados. Para mais informações, consulte Crie um app de pesquisa.

Exemplo de metadados

Confira este exemplo de metadados para quatro arquivos PDF (document_1.pdf, document_2.pdf, document_3.pdf e document_4.pdf). Esses metadados estariam em um arquivo JSON em um bucket do Cloud Storage, junto com os arquivos PDF. Você pode consulte este exemplo ao ler 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 da expressão do filtro

Entenda a sintaxe da expressão de filtro que você usará para defina seu filtro de pesquisa. A sintaxe da expressão de filtro pode ser resumida pela seguinte forma de Backus-Naur estendido:

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

Pesquisar usando um filtro de metadados

Para pesquisar usando um filtro de metadados, siga estas etapas:

  1. Determine o campo de metadados a ser usado para filtrar as consultas de pesquisa. Para exemplo, para os metadados em Antes de começar, é possível use o campo category como um filtro de pesquisa. Seus usuários podem filtrar persona_A, persona_B ou persona_C, então a pesquisa está restrita a documentos associados à persona em que estão interessados.

  2. Torne o campo de metadados indexável:

    1. No console do Google Cloud, acesse a página Criador de agentes e, no menu de navegação, clique em Apps.

      Acessar a página "Apps"

    2. Clique no seu app de pesquisa.

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

    4. Clique na guia Esquema. Essa guia mostra as configurações atuais do campo.

    5. Clique em Editar.

    6. Marque a caixa de seleção Indexável para o campo que você quer tornar indexáveis.

    7. Clique em Salvar. Para mais informações, consulte Configurar as configurações de campo.

  3. Encontre o ID do repositório de dados. Se você já tem seu repositório de dados ID, pule para a próxima etapa.

    1. No console do Google Cloud, acesse a página Agent Builder e No menu de navegação, clique em Repositórios de dados.

      Acesse a página "Repositórios de dados"

    2. Clique no nome do seu repositório de dados.

    3. Na página Dados do seu repositório de dados, encontre o ID do repositório.

  4. Receber resultados de 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"
    }'
    
    • PROJECT_ID: o ID do seu projeto.
    • DATA_STORE_ID: o ID do repositório de dados.
    • QUERY: o texto da consulta a ser pesquisado.
    • FILTER: opcional. Um campo de texto que permite filtrar um conjunto especificado de campos usando a sintaxe de expressão de filtro. O valor padrão é uma string vazia, o que significa que nenhum filtro é aplicado.

    Por exemplo, digamos que você tenha importado os quatro arquivos PDF com metadados de Antes de começar. Você quer pesquisar documentos que contêm a palavra "claims" e consulta apenas documentos com um valor category de persona_A. Você faria isso incluindo as seguintes declarações com seu ligue para:

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

    Para mais informações, consulte a guia REST em Receber resultados de pesquisa para um app com dados estruturados ou não estruturados.

    Clique para conferir um exemplo de resposta.

    Se você fizer uma pesquisa como a do procedimento anterior, você receberá uma resposta semelhante à seguinte. A resposta inclui os três documentos com um valor de category igual a 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": {}
    }
    

Exemplos de expressões de filtro

A tabela a seguir fornece exemplos de expressões de filtro.

Filtro Só retorna 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 é maior que o infinito negativo e menor que 100,0
non-smoking = \"true\" o booleano non-smoking for verdadeiro
pet-friendly = \"false\" o booleano pet-friendly for falso
manufactured_date = \"2023\" o manufactured date será em qualquer momento de 2023
manufactured_date >= \"2024-04-16\" a manufactured_date é de 16 de abril de 2024 em diante
manufactured_date < \"2024-04-16T12:00:00-07:00\" o manufactured_date é antes do meio-dia no horário de verão do Pacífico em 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 da 1600 Amphitheater Pkwy
NOT office.location:GEO_DISTANCE(\"Palo Alto, CA\", 1000) o campo de geolocalização office.location não está dentro de um 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á dentro de um raio de 500 m de latitude 34,1829 e longitude -121,293
category: ANY(\"persona_A\") AND score: IN(*, 100.0e) category é persona_A, e score é menor que 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 é menor que 175 e posso levar meu animal de estimação, ou price é menor que 125 e não posso levar meu animal de estimação

A seguir

  • Para entender o impacto dos filtros na qualidade da pesquisa, para avaliar a qualidade da pesquisa. Para mais informações, consulte Avaliar a qualidade da pesquisa.