Fazer pesquisa de texto completo com o SQL Connect

Firebase SQL Connect oferece suporte à pesquisa de texto completo, com tecnologia do PostgreSQL. A pesquisa de texto completo permite localizar 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.

É possível adicionar a pesquisa de texto completo ao seu serviço. Primeiro, adicione a diretiva @searchable à String no esquema em 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 a 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.
  • where permite adicionar filtros extras à 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 X primeiros resultados.
  • distinct adiciona o operador DISTINCT ao SQL gerado.

Escolha do idioma

Por padrão, a pesquisa de 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 correto permite que o PostgreSQL execute o stemming lexical preciso e ajuda a garantir que a pesquisa não perca resultados relevantes. Se você estiver pesquisando em várias colunas, elas precisam estar definidas no mesmo idioma.

Idiomas
  • simples
  • árabe
  • armênio
  • basco
  • catalão
  • dinamarquês
  • holandês
  • english
  • finlandês
  • francês
  • alemão
  • grego
  • hindi
  • húngaro
  • indonésio
  • irlandês
  • italiano
  • lituano
  • nepalesa
  • norueguês

Usando psql, é possível acessar a lista completa com a consulta a seguir.

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 queryFormat argumento no <pluralType>_search campo.

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 da Web (por exemplo, strings entre aspas, AND e OR). É 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").
  • ADVANCED permite criar consultas complexas usando o conjunto completo de operadores tsquery.

Limite de relevância

Definir um limite de relevância significa que a 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 relevância maior que 0 será relevante.

No entanto, se a pesquisa estiver retornando resultados que não parecem relevantes, o limite de relevância poderá filtrá-los.

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

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

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

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

Escolher entre pesquisa de texto completo, pesquisa de similaridade vetorial e filtros de padrão de string

SQL 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 Bom para encontrar linhas semanticamente semelhantes (por exemplo, recomendações ou 'Mais como este') Bom para correspondências de texto exatas ou pesquisas de expressões regulares
Realiza o stemming lexical, que ajuda a corresponder diferentes formas ou tempos da mesma palavra Requer a Vertex AI Usa menos memória e espaço em disco, já que não requer nenhum índice ou colunas geradas
Pode ser realizado em várias colunas de uma tabela Funciona apenas para uma única coluna por vez Pode ser realizado em várias colunas de uma tabela usando filtros OR
Bom desempenho em documentos maiores Bom desempenho em documentos grandes Menos desempenho ao pesquisar documentos maiores
Adiciona sobrecarga de memória e armazenamento para armazenar uma coluna gerada e um índice para cada pesquisa