Realiza una búsqueda de texto completo con SQL Connect

Firebase SQL Connect admite la búsqueda en el 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 en conjuntos de datos grandes buscando palabras clave y frases en varias columnas a la vez.

Puedes agregar la búsqueda en el texto completo a tu servicio. Primero, agrega la directiva @searchable a la String de tu esquema en la que deseas buscar. 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 <pluralType>_search campo 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 en el 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 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 X resultados principales.
  • offset hace que la consulta omita los primeros X resultados.
  • distinct agrega el operador DISTINCT al SQL generado.

Elección de idioma

De forma predeterminada, la búsqueda en el texto completo analiza 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 realizará un stemming léxico preciso y te ayudará a asegurarte de que tu búsqueda no omita resultados relevantes. Si buscas en varias columnas, todas deben configurarse en el mismo idioma.

Idiomas
  • sencillo.
  • arabic
  • 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 en el texto completo usa semántica web para las consultas (similar a la Búsqueda de Google). Puedes cambiar este comportamiento con el queryFormat argumento en el <pluralType>_search campo.

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

Existen cuatro opciones para el formato de consulta:

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

Umbral de relevancia

Establecer un umbral de relevancia significa que tu búsqueda solo mostrará resultados por encima de un cierto valor de relevancia. En muchos casos, no necesitarás establecerlo. Cualquier resultado que tenga una relevancia superior a 0 será un resultado pertinente.

Sin embargo, si descubres que tu búsqueda muestra resultados que no parecen pertinentes, 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

SQL 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
Es adecuada para implementar la funcionalidad de búsqueda general. Es adecuada para encontrar filas semánticamente similares (por ejemplo, recomendaciones o "Más contenido como este"). Es adecuada para coincidencias de texto exactas o búsquedas de expresiones regulares.
Realiza un stemming léxico, lo que ayuda a hacer coincidir diferentes formas o tiempos del mismo verbo. Requiere Vertex AI. Usa la menor cantidad de memoria y espacio en el disco, ya que no requiere ningún índice ni columna generada.
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 .
Tiene un buen rendimiento en documentos más grandes. Tiene un buen rendimiento en documentos grandes. Tiene un rendimiento más bajo 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.