Agrega la búsqueda de vectores de Firestore a tus apps para dispositivos móviles con Extensiones de Firebase

1. Descripción general

En este codelab, aprenderás a agregar funciones de búsqueda potentes a tu app con la búsqueda por similitud de vectores de Firestore. Implementarás una función de búsqueda semántica para una app de toma de notas escrita en Swift y SwiftUI.

La consola de Cloud Firestore muestra algunos documentos, que también se ven en la app para iOS en el lado derecho.

Qué aprenderás

  • Cómo instalar la extensión de Vector Search con Firestore para calcular incorporaciones vectoriales
  • Cómo llamar a Firebase Cloud Functions desde una aplicación en Swift
  • Cómo prefiltrar datos según el usuario que accedió a su cuenta

Lo que necesitarás

  • Xcode 15.3
  • El código de muestra del codelab Lo descargarás en un paso posterior del codelab.

2. Crea y configura un proyecto de Firebase

Para usar la extensión de Firebase Vector Search, necesitas un proyecto de Firebase. En esta parte del codelab, crearás un proyecto nuevo de Firebase y activarás los servicios necesarios, como Cloud Firestore y Firebase Authentication.

Crea un proyecto de Firebase

  1. Accede a la consola de Firebase con tu Cuenta de Google.
  2. Haz clic en el botón para crear un proyecto nuevo y, luego, ingresa un nombre (por ejemplo, Firestore Vector Search Codelab).
  3. Haz clic en Continuar.
  4. Si se te solicita, revisa y acepta las Condiciones de Firebase y, luego, haz clic en Continuar.
  5. (Opcional) Habilita la asistencia de IA en Firebase console (llamada "Gemini en Firebase").
  6. Para este codelab, no necesitas Google Analytics, por lo que debes desactivar la opción de Google Analytics.
  7. Haz clic en Crear proyecto, espera a que se aprovisione y, luego, haz clic en Continuar.

Para obtener más información sobre los proyectos de Firebase, consulta Información sobre los proyectos de Firebase.

Actualiza tu plan de precios de Firebase

Para usar las Extensiones de Firebase y sus servicios en la nube subyacentes, tu proyecto de Firebase debe tener el plan de precios de pago por uso (Blaze), lo que significa que está vinculado a una cuenta de Facturación de Cloud.

  • Una cuenta de facturación de Cloud requiere una forma de pago, como una tarjeta de crédito.
  • Si es la primera vez que usas Firebase y Google Cloud, verifica si cumples con los requisitos para obtener un crédito de USD 300 y una cuenta de Facturación de Cloud de prueba gratuita.
  • Si realizas este codelab como parte de un evento, pregúntale al organizador si hay créditos de Cloud disponibles.

Para actualizar tu proyecto al plan Blaze, sigue estos pasos:

  1. En Firebase console, selecciona la opción para actualizar tu plan.
  2. Selecciona el plan Blaze. Sigue las instrucciones en pantalla para vincular una cuenta de Facturación de Cloud a tu proyecto.
    Si necesitas crear una cuenta de Facturación de Cloud como parte de esta actualización, es posible que debas volver al flujo de actualización en Firebase console para completar la actualización.

Cómo habilitar y configurar los productos de Firebase en la consola

La app que estás compilando usa varios productos de Firebase que están disponibles para apps de Apple:

  • Firebase Authentication para permitir que los usuarios accedan a tu app con facilidad
  • Cloud Firestore, a fin de guardar datos estructurados en la nube y recibir notificaciones al instante cuando se modifiquen los datos
  • Reglas de seguridad de Firebase para proteger tu base de datos

Algunos de estos productos necesitan una configuración especial o deben habilitarse a través de Firebase console.

Habilita la autenticación anónima para Firebase Authentication

Esta aplicación usa la autenticación anónima para permitir que los usuarios comiencen a usar la app sin tener que crear una cuenta primero. Esto genera un proceso de integración sin inconvenientes. Para obtener más información sobre la autenticación anónima (y cómo actualizar a una cuenta con nombre), consulta Prácticas recomendadas para la autenticación anónima.

  1. En el panel lateral izquierdo de Firebase console, haz clic en Build > Authentication. Luego, haz clic en Comenzar.Cómo habilitar Firebase Authentication
  2. Ahora estás en el panel de Authentication, donde puedes ver los usuarios registrados, configurar proveedores de acceso y administrar la configuración.
  3. Selecciona la pestaña Método de acceso (o haz clic aquí para ir directamente a la pestaña).
  4. Haz clic en Anónimo en las opciones del proveedor, activa el interruptor Habilitar y, luego, haz clic en Guardar.

Configura Cloud Firestore

Esta aplicación en Swift usa Cloud Firestore para guardar notas.

Sigue estos pasos para configurar Cloud Firestore en tu proyecto de Firebase:

  1. En el panel izquierdo de Firebase console, expande Compilación y, luego, selecciona Base de datos de Firestore.
  2. Haz clic en Crear base de datos.
  3. Deja el ID de la base de datos establecido en (default).
  4. Selecciona una ubicación para tu base de datos y, luego, haz clic en Siguiente.
    Para una app real, debes elegir una ubicación cercana a tus usuarios.
  5. Haz clic en Comenzar en modo de prueba. Lee la renuncia de responsabilidad sobre las reglas de seguridad.
    Más adelante en este codelab, agregarás reglas de seguridad para proteger tus datos. No distribuyas ni expongas una app de forma pública sin agregar reglas de seguridad para tu base de datos.
  6. Haz clic en Crear.

Configura Cloud Storage para Firebase

La app web utiliza Cloud Storage para Firebase para almacenar, subir y compartir fotos.

Sigue estos pasos para configurar Cloud Storage para Firebase en tu proyecto de Firebase:

  1. En el panel izquierdo de Firebase console, expande Compilación y, luego, selecciona Storage.
  2. Haz clic en Comenzar.
  3. Selecciona una ubicación para tu bucket de Storage predeterminado.
    Los buckets en US-WEST1, US-CENTRAL1 y US-EAST1 pueden aprovechar el nivel “Siempre gratuito” para Google Cloud Storage. Los buckets de todas las demás ubicaciones siguen los precios y el uso de Google Cloud Storage.
  4. Haz clic en Comenzar en modo de prueba. Lee la renuncia de responsabilidad sobre las reglas de seguridad.
    Más adelante en este codelab, agregarás reglas de seguridad para proteger tus datos. No distribuyas ni expongas una app de forma pública sin agregar reglas de seguridad para tu bucket de Storage.
  5. Haz clic en Crear.

3. Conecta la app para dispositivos móviles

En esta sección del codelab, descargarás el código fuente de una app simple para tomar notas y la conectarás al proyecto de Firebase que acabas de crear.

Descarga la app de ejemplo:

  1. Ve a https://github.com/FirebaseExtended/codelab-firestore-vectorsearch-ios y clona el repositorio en tu máquina local.
  2. Abre el proyecto Notes.xcodeproj en Xcode.

Conecta la app a tu proyecto de Firebase

Para que tu app pueda acceder a los servicios de Firebase, deberás configurarla en Firebase console. Puedes conectar varias aplicaciones cliente al mismo proyecto de Firebase. Por ejemplo, si creas una app para Android o una app web, debes conectarlas al mismo proyecto de Firebase.

Para obtener más información sobre los proyectos de Firebase, consulta Información sobre los proyectos de Firebase.

  1. En Firebase console, ve a la página de descripción general de tu proyecto de Firebase.La página de descripción general de Firebase console
  2. Haz clic en el ícono de iOS+ para agregar tu app para iOS.
  3. En la pantalla Add Firebase to your Apple app, inserta el ID de paquete del proyecto de Xcode (com.google.firebase.codelab.Notes).
  4. Si quieres, puedes ingresar un sobrenombre para la app (Notas para iOS).
  5. Haz clic en Registrar app para avanzar al siguiente paso.
  6. Descarga el archivo GoogleServices-Info.plist.
  7. Arrastra GoogleServices-Info.plist a la carpeta Notes de tu proyecto de Xcode. Una buena forma de hacerlo es soltarlo debajo del archivo Assets.xcassets.Cómo arrastrar el archivo plist a Xcode
  8. Selecciona Copy items if needed, asegúrate de que el destino Notes esté seleccionado en Add to targets y haz clic en Finish.Selecciona “Copiar si es necesario” en el diálogo de opciones para agregar archivos.
  9. En Firebase console, ahora puedes hacer clic en el resto del proceso de configuración: la muestra que descargaste al principio de esta sección ya tiene instalado el SDK de Firebase para Apple y la configuración de inicialización. Para finalizar el proceso, haz clic en Ir a la consola.

Ejecuta la app

Ahora es momento de probar la app.

  1. De vuelta en Xcode, ejecuta la app en el simulador de iOS. En el menú desplegable Run Destinations, primero selecciona uno de los simuladores de iOS.Selecciona un simulador de iOS en el menú desplegable Run Destinations.
  2. Luego, haz clic en el botón Ejecutar o presiona ⌘ + R.
  3. Una vez que la app se haya iniciado correctamente en el simulador, agrega algunas notas.
  4. En Firebase console, navega al explorador de datos de Firestore para que puedas ver los documentos nuevos que se crean a medida que agregas notas nuevas en la app.Consola de Cloud Firestore que muestra algunos documentos, junto con el simulador de iOS que muestra los mismos documentos

4. Instala la extensión Vector Search with Firestore

En esta parte del codelab, instalarás la extensión Vector Search with Firestore y la configurarás según los requisitos de la app para tomar notas en la que estás trabajando.

Inicia la instalación de la extensión

  1. En la sección Firestore, haz clic en la pestaña Extensiones.Selecciona la pestaña Firebase Extensions en la consola de Firestore.
  2. Haz clic en Explorar el Centro de extensiones.Pestaña Extensiones de Firebase en la consola de Firestore
  3. Escribe "vector".
  4. Haz clic en “Extensión de Vector Search con Firestore”.Página de destino del Centro de extensiones de Firebase Esto te llevará a la página de detalles de la extensión, en la que podrás leer más sobre ella, cómo funciona, qué servicios de Firebase requiere y cómo puedes configurarla.
  5. Haz clic en Instalar en Firebase console.El botón de instalación de la extensión Vector Search with Firestore
  6. Aparecerá una lista de todos tus proyectos.
  7. Elige el proyecto que creaste en el primer paso de este codelab.La pantalla del selector de proyectos de Firebase

Configura la extensión

  1. Revisa las APIs habilitadas y los recursos creados.Revisar las APIs habilitadas
  2. Habilita los servicios requeridos.Habilita los servicios obligatorios
  3. Una vez que todos los servicios estén habilitados, haz clic en Siguiente.Haz clic en Siguiente después de habilitar todos los servicios
  4. Revisa el acceso otorgado a esta extensión.
  5. Configura la extensión:
    • Selecciona Vertex AI como el LLM.
    • Ruta de la colección: notes
    • Límite de consultas predeterminado: 3
    • Nombre del campo de entrada: text
    • Nombre del campo de salida: embedding
    • Nombre del campo de estado:* *status*
    • Incorporar documentos existentes:
    • Actualizar documentos existentes:
    • Ubicación de Cloud Function: us-central1
  6. Haz clic en Instalar extensión para finalizar la instalación.

Este proceso puede tardar unos minutos. Mientras esperas a que se complete la instalación, puedes avanzar a la siguiente sección del instructivo y leer información general sobre las incorporaciones de vectores.

5. Segundo plano

Mientras esperas a que finalice la instalación, aquí tienes información general sobre cómo funciona la extensión Vector Search with Firestore.

¿Qué son los vectores, los embeddings y las bases de datos vectoriales?

  • Los vectores son objetos matemáticos que representan la magnitud y la dirección de una cantidad. Se pueden usar para representar datos de una manera que facilite la comparación y la búsqueda.
  • Los embeddings son vectores que representan el significado de una palabra o frase. Se crean entrenando una red neuronal en un gran corpus de texto y aprendiendo las relaciones entre las palabras.
  • Las bases de datos de vectores son bases de datos optimizadas para almacenar y buscar datos de vectores. Permiten realizar búsquedas eficientes de vecinos más cercanos, que es el proceso de encontrar los vectores más similares a un vector de búsqueda determinado.

¿Cómo funciona la Búsqueda de vectores?

La búsqueda de vectores funciona comparando el vector de la búsqueda con todos los vectores de la base de datos. Los vectores más similares al vector de la búsqueda se muestran como resultados de la búsqueda.

La similitud entre dos vectores se puede medir con una variedad de métricas de distancia. La métrica de distancia más común es la similitud coseno, que mide el ángulo entre dos vectores.

6. Prueba la extensión de Vector Search con Firestore

Antes de usar la extensión Vector Search con Firestore en la app para iOS que descargaste anteriormente en este codelab, puedes probar la extensión en Firebase console.

Leer la documentación

Las extensiones de Firebase incluyen documentación sobre su funcionamiento.

  1. Cuando finalice la instalación de la extensión, haz clic en el botón Comenzar. La página de descripción general de la extensión de Firebase en Firebase console
  2. Consulta la pestaña "Cómo funciona esta extensión", en la que se explica lo siguiente:
    • cómo calcular las incorporaciones de documentos agregándolos a la colección notes
    • cómo consultar el índice llamando a la función ext-firestore-vector-search-queryCallable que admite llamadas
    • o cómo consultar el índice agregando un documento de consulta a la colección _firestore-vector-search/index/queries
    • También se explica cómo configurar una función de incorporación personalizada, lo que resulta útil si ninguno de los LLM compatibles con la extensión cumple con tus requisitos y deseas usar un LLM diferente para calcular las incorporaciones. Documentación de la extensión Vector Search with Firestore
  3. Haz clic en el vínculo del panel de Cloud Firestore para ir a tu instancia de Firestore.
  4. Navega al documento _firestore-vector-search/index. Debería mostrar que la extensión terminó de calcular los embeddings para todos los documentos de notas que creaste en un paso anterior de este codelab.La configuración del índice dentro de la consola de Firestore
  5. Para verificarlo, abre uno de los documentos de notas y deberías ver un campo adicional llamado embedding de tipo vector<768>, así como un campo status.Un campo de embedding de vectores dentro de la consola de Firestore

Crea un documento de muestra

Puedes crear un documento nuevo en Firebase console para ver la extensión en acción.

  1. Aún en el navegador de datos de Firestore, navega a la colección notes y haz clic en + Agregar documento en la columna central.Cómo agregar un documento nuevo
  2. Haz clic en ID automático para generar un nuevo ID de documento único.
  3. Agrega un campo llamado text de tipo cadena y pega texto en el campo value. Es importante que no sea lorem ipsum ni algún otro texto aleatorio. Elige un artículo de noticias, por ejemplo.Cómo agregar un campo de texto
  4. Haz clic en Guardar.
    • Observa cómo la extensión agrega un campo de estado para indicar que está procesando datos.
    • Después de un momento, deberías ver un nuevo campo embedding con el valor vector<768>.
    Actualización del estado de los embeddings de vectores para el documento nuevo

Realiza una consulta

La extensión de Vector Search con Firestore tiene una pequeña y útil función que te permite consultar el índice de documentos sin tener que conectar una app.

  1. En la sección Firestore de Firebase console, ve al documento _firestore-vector-search/index.
  2. Haz clic en + Iniciar colección.Cómo agregar una subcolección nueva
  3. Crea una nueva subcolección llamada queries.
  4. Crea un documento nuevo y establece el campo query en un texto que aparezca en uno de tus documentos. Esto funciona mejor para las búsquedas semánticas, como "¿Cómo puedo asignar documentos de Firestore con Swift?" (siempre que al menos una de las notas que agregaste contenga texto que analice este tema).Cómo agregar un campo de consulta
  5. Es posible que veas un error en el estadoSe produjo un error
  6. Esto se debe a que falta un índice. Para configurar el índice faltante, ve a la consola de Google Cloud de tu proyecto a través de este vínculo y, luego, selecciona tu proyecto en la listaCómo seleccionar el proyecto correcto
  7. En el Explorador de registros de Cloud, ahora deberías ver un mensaje de error que dice "FAILED_PRECONDITION: Missing vector index configuration. Crea el índice requerido con el siguiente comando de gcloud: …"Mensaje de error en el Explorador de registros
  8. El mensaje de error también contiene un comando gcloud que debes ejecutar para configurar el índice faltante.
  9. Ejecuta el siguiente comando desde la línea de comandos. Si no tienes instalada la CLI de gcloud en tu máquina, sigue las instrucciones que se indican aquí para instalarla.
    gcloud alpha firestore indexes composite create --project=INSERT-YOUR=PROJECT-ID-HERE --collection-group=notes --query-scope=COLLECTION --field-config=vector-config='{"dimension":"768","flat": "{}"}',field-path=embedding
    
    La creación del índice tarda unos minutos. Puedes verificar el progreso en la pestaña Índices de la sección Firestore de Firebase console.Estado del índice nuevo
  10. Una vez que se configure el índice, podrás crear un nuevo documento de consulta.
  11. Ahora deberías ver una lista de los IDs de documentos coincidentes en el campo de resultadosResultado de realizar una búsqueda semántica
  12. Copia uno de esos IDs y vuelve a la colección notes.
  13. Usa ⌘ + F para buscar el ID del documento que copiaste. Este documento es el que mejor coincide con tu búsqueda.Cómo encontrar el ID del documento en la lista de documentos

7. Implementa la búsqueda semántica

Finalmente, es hora de conectar tu app para dispositivos móviles a la extensión de Vector Search con Firestore y, luego, implementar una función de búsqueda semántica que permitirá a los usuarios buscar sus notas con consultas en lenguaje natural.

Conecta la función que admite llamadas para realizar consultas

La extensión de Vector Search con Firestore incluye una Cloud Function a la que puedes llamar desde tu app para dispositivos móviles para consultar el índice que creaste anteriormente en este codelab. En este paso, establecerás una conexión entre tu app para dispositivos móviles y esta función que admite llamadas. El SDK de Swift de Firebase incluye APIs que facilitan la llamada a funciones remotas.

  1. Regresa a Xcode y asegúrate de estar en el proyecto que clonaste en un paso anterior de este codelab.
  2. Abre el archivo NotesRepository.swift.
  3. Busca la línea que contiene private lazy var vectorSearchQueryCallable: Callable = functions.httpsCallable("").

Para invocar una Cloud Function invocable, debes proporcionar el nombre de la función que deseas llamar.

  1. Ve a Firebase console para tu proyecto y abre el elemento de menú Functions en la sección Build.
  2. Verás una lista de las funciones que instaló la extensión.
  3. Busca el que se llama ext-firestore-vector-search-queryCallable y copia su nombre.
  4. Pega el nombre en tu código. Ahora debería decir
    private lazy var vectorSearchQueryCallable: Callable<String, String> = functions.httpsCallable("ext-firestore-vector-search-queryCallable")
    

Llama a la función de consulta

  1. Busca el método performQuery.
  2. Llama a tu función que admite llamadas invocando
    let result = try await vectorSearchQueryCallable(searchTerm)
    

Como se trata de una llamada remota, es posible que falle.

  1. Agrega un control básico de errores para detectar cualquier error y registrarlo en la consola de Xcode.
    private func performQuery(searchTerm: String) async -> [String] {
      do {
        let result = try await vectorSearchQueryCallable(searchTerm)
        return [result]
      }
      catch {
        print(error.localizedDescription)
        return []
      }
    }
    

Conecta la IU

Para permitir que los usuarios busquen sus notas, implementarás una barra de búsqueda en la pantalla de la lista de notas. Cuando el usuario escriba un término de búsqueda, deberás invocar el método performQuery que implementaste en el paso anterior. Gracias a los modificadores de vista searchable y task que proporciona SwiftUI, esto solo requiere un par de líneas de código.

  1. Primero, abre NotesListScreen.swift.
  2. Para agregar un cuadro de búsqueda a la vista de lista, agrega el modificador de vista .searchable(text: $searchTerm, prompt: "Search") justo arriba de la línea .navigationTitle("Notes").
  3. Luego, invoca la función de búsqueda agregando el siguiente código justo debajo:
.task(id: searchTerm, debounce: .milliseconds(800)) {
  await notesRepository.semanticSearch(searchTerm: searchTerm)
}

Este fragmento de código llama a tu método semanticSearch de forma asíncrona. Si proporcionas un tiempo de espera de 800 milisegundos, le indicas al modificador de tareas que elimine el rebote de la entrada del usuario en 0.8 segundos. Esto significa que semanticSearch solo se llamará una vez que el usuario deje de escribir durante más de 0.8 segundos.

Ahora, tu código debería verse de la siguiente manera:

...
List(repository.notes) { note in
  NavigationLink(value: note) {
    NoteRowView(note: note)
  }
  .swipeActions {
    Button(role: .destructive, action: { deleteNote(note: note) }) {
      Label("Delete", systemImage: "trash")
    }
  }
}
.searchable(text: $searchTerm, prompt: "Search")
.task(id: searchTerm, debounce: .milliseconds(800)) {
  await notesRepository.semanticSearch(searchTerm: searchTerm)
}
.navigationTitle("Notes")
...

Ejecuta la app

  1. Presiona ⌘ + R (o haz clic en el botón Run) para iniciar la app en el simulador de iOS.
  2. Deberías ver las mismas notas que agregaste en la app anteriormente en este codelab, así como las notas que agregaste a través de Firebase console.
  3. Deberías ver un campo de búsqueda en la parte superior de la lista Notas.
  4. Escribe un término que aparezca en uno de los documentos que agregaste. Nuevamente, esto funciona mejor para las búsquedas semánticas, como "¿Cómo puedo llamar a las APIs asíncronas de Firebase desde Swift?" (siempre que al menos una de las notas que agregaste contenga texto que analice este tema).
  5. Probablemente esperes ver el resultado de la búsqueda, pero, en cambio, la vista de lista está vacía y la consola de Xcode muestra un mensaje de error: "Se llamó a la función con un argumento no válido".

La app de Notas, con una lista de resultados vacía

Esto significa que enviaste los datos en el formato incorrecto.

Analiza el mensaje de error

  1. Para saber qué sucede, ve a Firebase console
  2. Ve a la sección Funciones.
  3. Busca la función ext-firestore-vector-search-queryCallable y abre el menú ampliado haciendo clic en los tres puntos verticales.
  4. Selecciona Ver registros para ir al Explorador de registros.
  5. Deberías ver un error.
Unhandled error ZodError: [
  {
    "code": "invalid_type",
    "expected": "object",
    "received": "string",
    "path": [],
    "message": "Expected object, received string"
  }
]

Esto significa que enviaste los datos en el formato incorrecto.

Usa los tipos de datos correctos

Para saber en qué formato espera la extensión que se encuentren los parámetros, consulta su documentación.

  1. Ve a la sección Extensiones en Firebase console.
  2. Haz clic en Administrar ->Administra la extensión de Vector Search con Firestore.
  3. En la sección Cómo funciona esta extensión, encontrarás una especificación de los parámetros de entrada y salida.Documentación del parámetro de entrada y el valor del resultado
  4. Regresa a Xcode y navega a NotesRepository.swift.
  5. Agrega el siguiente código al comienzo del archivo:
    private struct QueryRequest: Codable {
      var query: String
      var limit: Int?
      var prefilters: [QueryFilter]?
    }
    
    private struct QueryFilter: Codable {
      var field: String
      var `operator`: String
      var value: String
    
    }
    
    private struct QueryResponse: Codable {
      var ids: [String]
    }
    
    QueryRequest coincide con la estructura del parámetro de entrada que espera la extensión, según la documentación de la extensión. También contiene un atributo prefilter anidado que necesitarás más adelante.QueryResponse coincide con la estructura de la respuesta de la extensión.
  6. Busca la especificación de la función llamable y actualiza los tipos de entrada y salida
    private lazy var vectorSearchQueryCallable: Callable<QueryRequest, QueryResponse> = functions.httpsCallable("ext-firestore-vector-search-queryCallable")
    
  7. Actualiza la invocación de la función que admite llamadas en performQuery
    private func performQuery(searchTerm: String) async -> [String] {
      do {
        let queryRequest = QueryRequest(query: searchTerm,
                                        limit: 2)
        let result = try await vectorSearchQueryCallable(queryRequest)
        print(result.ids)
        return result.ids
      }
      catch {
        print(error.localizedDescription)
        return []
      }
    }
    

Vuelve a ejecutar la app

  1. Vuelve a ejecutar la app
  2. Escribe una búsqueda que contenga términos incluidos en una de tus notas.
  3. Ahora deberías ver una lista filtrada de notas.

Captura de pantalla de la app con el resultado esperado

Aplica un filtro previo a los datos del usuario

Antes de que te pongas a bailar para celebrar, hay un problema con la versión actual de la app: el conjunto de resultados contiene datos de todos los usuarios.

Para verificarlo, ejecuta la app en otro simulador y agrega más documentos. Los documentos nuevos solo aparecerán en ese simulador. Si vuelves a ejecutar la app en el otro simulador, solo verás los documentos que creaste la primera vez.

Si realizas una búsqueda, notarás que la llamada a vectorSearchQueryCallable devuelve IDs de documentos que podrían pertenecer al otro usuario. Para evitar esto, debemos usar un prefiltro.

En performQuery, actualiza tu código de la siguiente manera:

  let prefilters: [QueryFilter] = if let uid = user?.uid {
    [QueryFilter(field: "userId", operator: "==", value: uid)]
  }
  else {
    []
  }

  let queryRequest = QueryRequest(query: searchTerm,
                                  limit: 2,
                                  prefilters: prefilters)

Esto filtrará previamente los datos según el ID del usuario que accedió. Como es de esperar, esto requiere que se actualice el índice de Firestore.

Ejecuta el siguiente comando desde la línea de comandos para definir un nuevo índice de Firestore que incluya tanto el campo userId como las incorporaciones de vectores en el campo embedding.

gcloud alpha firestore indexes composite create --project=INSERT-YOUR-PROJECT-ID-HERE --collection-group=notes --query-scope=COLLECTION --field-config=order=ASCENDING,field-path=userId --field-config=vector-config='{"dimension":"768","flat": "{}"}',field-path=embedding

Una vez que se haya terminado de compilar el índice, vuelve a ejecutar la app para verificar que funcione según lo esperado.

Conjunto de resultados prefiltrados

8. Felicitaciones

¡Felicitaciones por completar este codelab!

En este codelab, aprendiste a hacer lo siguiente:

  • Configura una base de datos de Cloud Firestore con la búsqueda semántica habilitada.
  • Crea una app de SwiftUI simple para interactuar con la base de datos.
  • Implementa una barra de búsqueda con el modificador de vista searchable de SwiftUI y el modificador task.
  • Llama a una Cloud Function para realizar una búsqueda semántica en la base de datos con la interfaz Callable del SDK de Firestore.

Con los conocimientos que adquiriste en este codelab, ahora puedes compilar aplicaciones potentes que aprovechen las capacidades de búsqueda semántica de Cloud Firestore para brindar a los usuarios una experiencia de búsqueda más intuitiva y eficiente.

Para obtener más información sobre el nuevo campo de vectores de Firestore y cómo calcular las incorporaciones de vectores, consulta la documentación.