firebase google-cloud-firestore

firebase - Búsqueda por patrón en la colección Cloud Firestore



google-cloud-firestore (1)

Estoy intentando realizar un filtro por patrón sobre una colección Firestore. Por ejemplo, en mi base de datos Firestore tengo una marca llamada adidas . El usuario tendría una entrada de búsqueda, donde escribir "adi", "adid", "adida" o "adidas" devuelve el documento de adidas . Señalé varias soluciones para hacer esto:


1. Obtener todos los documentos y realizar un filtro de front-end

var brands = db.collection("brands"); filteredBrands = brands.filter((br) => br.name.includes("pattern"));

Esta solución obviamente no es una opción debido a los precios de Firestore. Además, podría ser bastante largo realizar la solicitud si el número de documentos es alto.


2. Uso de Algolia o Algolia

Esto podría ser interesante. Sin embargo, creo que esto es un poco excesivo para agregar el soporte de estas soluciones solo para una búsqueda de patrones, y también esto puede ser rápidamente costoso.


3. Campo de nombre de searchName personalizado en la creación del objeto

Así que tuve esta solución: en la creación del documento, cree un campo con una serie de posibles patrones de búsqueda:

{ ... "name":"adidas", "searchNames":[ "adi", "adida", "adidas" ], ... }

Para que se pueda acceder al documento con:

filteredBrands = db.collection("brands").where("searchNames", "array-contains", "pattern");

Así que tuve varias preguntas:

  • ¿Qué piensa acerca de la pertinencia y la eficiencia de esta tercera solución? ¿Hasta qué punto cree que esto podría ser mejor que utilizar una solución de terceros como Elasticsearch o Algolia?
  • ¿Tiene alguna otra idea para realizar un filtro de patrón sobre una colección firestore?

En mi humilde opinión, la primera solución definitivamente no es una opción. Descargar una colección completa para buscar campos del lado del cliente no es práctico en absoluto y también es muy costoso.

La segunda opción es la mejor opción, ya que le ayudará a habilitar la búsqueda de texto completo en toda su base de datos de Cloud Firestore. Depende de usted decidir si vale la pena usarlo o no.

¿Qué piensa acerca de la pertinencia y la eficiencia de esta tercera solución?

Con respecto a la tercera solución, podría funcionar, pero implica que usted crea una serie de posibles paternas de búsqueda, incluso si la marca es muy larga. Como veo en su esquema, está agregando los posibles patrones de búsqueda a partir de la tercera letra, lo que significa que si alguien está buscando un ad , no se encontrará ningún resultado. El inconveniente de esta solución es el hecho de que si tiene una marca llamada Asics Tiger y el usuario está buscando Tig o Tige , no tendrá más resultados.

¿Tiene alguna otra idea para realizar un filtro de patrón en una colección Firestore?

Si está interesado en obtener resultados solo de una sola palabra y usando como patrón las letras iniciales de la marca, le recomiendo una mejor solución que esté utilizando una consulta que se vea así:

var brands = db.collection("brands"); brands.orderBy("name").startAt(searchName).endAt(searchName + "/uf8ff")

En este caso, una búsqueda como a o a ad funcionará perfectamente bien. Además de eso, no habrá necesidad de crear ninguna otra matriz. Así que habrá menos escrituras de documentos.