Fazer pesquisa de texto completo com o Data Connect

O Firebase Data Connect oferece suporte à pesquisa de texto completo com tecnologia PostgreSQL. Com a pesquisa de texto completo, você localiza informações de maneira rápida e eficiente em grandes conjuntos de dados pesquisando palavras-chave e frases em várias colunas ao mesmo tempo.

Você pode adicionar a pesquisa de texto completo ao seu serviço. Primeiro, adicione a diretiva @searchable ao String no esquema que você quer pesquisar. Exemplo:

type Movie
  @table {

  # The fields you want to search over
  title: String! @searchable
  genre: String @searchable
  description: String @searchable
  tags: [String]

  # Some other fields that we won't search over
  rating: Float
  imageUrl: String!
  releaseYear: Int
}

Depois de adicionar essa diretiva, você pode realizar uma pesquisa de texto completo adicionando o campo <pluralType>_search a uma consulta. Nesse caso, será movies_search:

query SearchMovies($query: String) @auth(level: PUBLIC) {
  movies_search(query: $query) {
    id
    title
    imageUrl
    releaseYear
    genre
    rating
    tags
    description
  }
}

Ajustar os resultados da pesquisa de texto completo

É possível ajustar os resultados da pesquisa de texto completo adicionando argumentos à diretiva @searchable e ao campo _search.

Argumentos compartilhados

É possível controlar os resultados da pesquisa com muitos dos mesmos argumentos usados para campos de lista básicos <pluralType>:

  • order permite mudar a ordem dos resultados. Se omitido, os resultados serão ordenados por relevância decrescente.
  • Com o where, você pode adicionar outros filtros à pesquisa (por exemplo, pesquisar apenas filmes de um gênero específico).
  • limit faz com que a consulta retorne apenas os X principais resultados.
  • offset faz com que a consulta pule os primeiros X resultados.
  • O distinct adiciona o operador DISTINCT ao SQL gerado.

Escolha de idioma

Por padrão, a pesquisa em texto completo analisa documentos em inglês. É possível mudar isso com o argumento de idioma na diretiva @searchable:

type Movie
  @table {
  title: String! @searchable(language: "french")
  ...
}

Especificar o idioma certo permite que o PostgreSQL realize stemming lexical preciso e ajuda a garantir que sua pesquisa não perca resultados relevantes. Se você estiver pesquisando em várias colunas, todas elas precisam estar definidas no mesmo idioma.

Idiomas
  • simples
  • árabe
  • armênia
  • basca
  • catalã
  • dinamarquês
  • holandês
  • english
  • finlandesa
  • francês
  • alemão
  • grego
  • hindi
  • húngara
  • indonésia
  • irlandês
  • italiano
  • lituana
  • nepalesa
  • norueguês

Usando psql, você pode acessar a lista completa com a seguinte consulta.

SELECT cfgname FROM pg_ts_config;

Formato da consulta

Por padrão, a pesquisa de texto completo usa semântica da Web para consultas, semelhante à Pesquisa Google. É possível mudar esse comportamento com o argumento queryFormat no campo <pluralType>_search.

query SearchMovies($query: String) @auth(level: PUBLIC) {
  movies_search(query: $query, queryFormat: PHRASE) {
    ...
  }
}

Há quatro opções de formato de consulta:

  • QUERY oferece semântica familiar aos mecanismos de pesquisa na Web (por exemplo, strings entre aspas, AND e OR). Esse é o padrão.
  • PLAIN corresponde a todas as palavras, mas não necessariamente juntas ("cachorro marrom" vai corresponder a "o cachorro marrom e branco" ou "o cachorro branco e marrom").
  • PHRASE corresponde a uma frase exata ( "cachorro marrom" vai corresponder a "o cachorro branco e marrom", mas não a "cachorro marrom e branco").
  • AVANÇADO permite criar consultas complexas usando o conjunto completo de operadores tsquery.

Limite de relevância

Definir um limite de relevância significa que sua pesquisa só vai retornar resultados acima de um determinado valor de relevância. Em muitos casos, não é necessário definir isso. Qualquer resultado com uma relevância maior que 0 é relevante.

No entanto, se você achar que a pesquisa está retornando resultados irrelevantes, o limite de relevância pode filtrá-los.

Para descobrir um valor adequado para o limite de relevância, faça algumas pesquisas de teste e analise o _metadata.relevance:

query SearchMovies($query: String) @auth(level: PUBLIC) {
  movies_search(query: $query) {
    id
    title
    _metadata {
      relevance
    }
    ...
  }
}

Escolha um limite que omita resultados irrelevantes. Para fazer isso, siga estas etapas:

query SearchMovies($query: String) @auth(level: PUBLIC) {
  movies_search(query: $query, relevanceThreshold: 0.05) {
    id
    title
    ...
  }
}

Como escolher entre pesquisa de texto completo, pesquisa de similaridade vetorial e filtros de padrões de string

O Data Connect oferece algumas maneiras diferentes de pesquisar no seu banco de dados.

Use esta tabela para escolher a opção certa para seu caso de uso.

Pesquisa de texto completo Pesquisa de similaridade vetorial Filtros de padrão de string
Bom para implementar a funcionalidade de pesquisa geral Boa para encontrar linhas semanticamente semelhantes (por exemplo, recomendações ou "Mais como isso") Ideal para correspondências de texto exatas ou pesquisas por expressões regulares
Realiza a lematização lexical, que ajuda a corresponder diferentes formas ou tempos do mesmo vocábulo. Requer a Vertex AI Usa o mínimo de memória e espaço em disco, já que não exige índices nem colunas geradas.
Pode ser realizada em várias colunas de uma tabela Funciona apenas para uma coluna por vez Pode ser realizada em várias colunas de uma tabela usando filtros OR.
Desempenho em documentos maiores Desempenho em documentos grandes Menos eficiente ao pesquisar documentos maiores
Adiciona sobrecarga de memória e armazenamento para armazenar uma coluna gerada e um índice para cada pesquisa