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