Realiza búsquedas en el texto completo con Data Connect

Firebase Data Connect admite la búsqueda de texto completo con tecnología de PostgreSQL. La búsqueda en el texto completo te permite ubicar información de forma rápida y eficiente dentro de grandes conjuntos de datos buscando palabras clave y frases en varias columnas a la vez.

Puedes agregar la búsqueda de texto completo a tu servicio. Primero, agrega la directiva @searchable al String en tu esquema en el que deseas realizar la búsqueda. Por ejemplo:

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
}

Una vez que agregues esta directiva, podrás realizar una búsqueda en el texto completo agregando el campo <pluralType>_search a una consulta. En este caso, será movies_search:

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

Cómo ajustar los resultados de la búsqueda en el texto completo

Puedes ajustar los resultados de la búsqueda de texto completo agregando argumentos a la directiva @searchable y al campo _search.

Argumentos compartidos

Puedes controlar los resultados de la búsqueda con muchos de los mismos argumentos que se usan para los campos de lista básicos <pluralType>:

  • order te permite cambiar el orden de los resultados. Si se omite, los resultados se ordenarán por relevancia en orden descendente.
  • where te permite agregar filtros adicionales a la búsqueda (p.ej., buscar solo películas de un género específico).
  • limit hace que la consulta solo muestre los primeros X resultados.
  • offset hace que la consulta omita los primeros X resultados.
  • distinct agrega el operador DISTINCT al código SQL generado.

Elección de idioma

De forma predeterminada, la búsqueda en el texto completo analiza los documentos en inglés. Puedes cambiar esto con el argumento de idioma en la directiva @searchable:

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

Si especificas el idioma correcto, PostgreSQL podrá realizar una derivación léxica precisa y garantizar que tu búsqueda no omita resultados relevantes. Si realizas la búsqueda en varias columnas, todas deben estar configuradas en el mismo idioma.

Lenguajes
  • sencillo.
  • árabe
  • armenio/armenia
  • vasco/vasca
  • catalán/catalana
  • danés/danesa
  • neerlandés/neerlandesa
  • inglés/inglesa
  • finlandés/finlandesa
  • francés/francesa
  • alemán/alemana
  • griego/griega
  • hindi
  • húngaro/húngara
  • indonesio/indonesia
  • irlandés/irlandesa
  • italiano/italiana
  • lituano/lituana
  • nepalí
  • noruego/noruega

Con psql, puedes obtener la lista completa con la siguiente consulta.

SELECT cfgname FROM pg_ts_config;

Formato de consulta

De forma predeterminada, la búsqueda de texto completo usa la semántica web para las búsquedas (similar a la Búsqueda de Google). Puedes cambiar este comportamiento con el argumento queryFormat en el campo <pluralType>_search.

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

Existen cuatro opciones para el formato de la búsqueda:

  • QUERY proporciona una semántica familiar a los motores de búsqueda web (p.ej., cadenas entre comillas, AND y OR). Es el valor predeterminado.
  • PLAIN coincide con todas las palabras, pero no necesariamente juntas ("perro marrón" coincidirá con "el perro marrón y blanco" o "el perro blanco y marrón").
  • PHRASE coincide con una frase exacta ( "perro marrón" coincidirá con "el perro blanco y marrón", pero no con "perro marrón y blanco").
  • AVANZADO te permite crear consultas complejas con el conjunto completo de operadores de tsquery.

Umbral de relevancia

Establecer un umbral de relevancia significa que tu búsqueda solo devolverá resultados por encima de un determinado valor de relevancia. En muchos casos, no será necesario que configures este parámetro, ya que cualquier resultado con una relevancia superior a 0 será pertinente.

Sin embargo, si ves que tu búsqueda devuelve resultados que no te parecen relevantes, el umbral de relevancia puede filtrarlos por ti.

Para determinar un valor adecuado para el umbral de relevancia, debes realizar algunas búsquedas de prueba y observar el _metadata.relevance:

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

Elige un umbral que omita los resultados que consideres irrelevantes. Para ello, deberás hacer lo siguiente:

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

Cómo elegir entre la búsqueda de texto completo, la búsqueda de similitud de vectores y los filtros de patrones de cadenas

Data Connect ofrece varias formas diferentes de buscar en tu base de datos.

Usa esta tabla para elegir la opción adecuada para tu caso de uso.

Búsqueda en el texto completo Búsqueda de similitud de vectores Filtros de patrones de cadenas
Ideal para implementar la funcionalidad de búsqueda general Es útil para encontrar filas semánticamente similares (por ejemplo, recomendaciones o "Más como este"). Es útil para las coincidencias de texto exactas o las búsquedas de expresiones regulares.
Realiza la derivación léxica, lo que ayuda a hacer coincidir diferentes formas o tiempos verbales de la misma palabra. Requiere Vertex AI Usa la menor cantidad de memoria y espacio en disco, ya que no requiere índices ni columnas generadas.
Se puede realizar en varias columnas de una tabla. Solo funciona para una sola columna a la vez Se puede realizar en varias columnas de una tabla con filtros OR.
Rendimiento en documentos más grandes Rendimiento en documentos grandes Menos rendimiento cuando se buscan documentos más grandes
Agrega sobrecarga de memoria y almacenamiento para almacenar una columna generada y un índice para cada búsqueda.