¿Cómo reducir el número de lecturas en una colección Firestore?

Johan Bormman:

He aprendido cómo utilizar la paginación de una pregunta anterior mío y he aplicado en mi una aplicación de diccionario de términos marítimos. Hay un montón de términos en la base de datos.

El PP es de esta manera:

maritime_terms
  |- id
      |- term: "broad reach"
      |- details: "Sailing with the wind abaft the beam."
      |- etc

Al igual que en los documentos que utilizo:

db.collection("maritime_terms")
        .startAt(searchText)
        .endAt(searchText+ "\uf8ff")
        .limit(20);

Cuando comienzo a buscar por ejemplo "amplio alcance" y escriba la primera letra b, recibo 20 resultados. Cuando escribo la segunda letra, consigo otros 20 resultados. Y así. El problema es que para cada letra escribo consigo 20 lee, por lo que para una simple búsqueda en que recibo de mínimo de 100 lecturas a 150 o incluso más.

Hasta ahora mi aplicación funciona muy bien, pero creo que es caro para una aplicación simple diccionario. ¿Cómo puedo reducir el enorme número de lecturas?

Alex Mamo :

Si bien la respuesta de Fogmeister puede ayudar a reducir el número de lecturas de manera significativa, voy a tratar de darle otro enfoque, pero va a implicar un cambio en la estructura de su base de datos. Así que esto es lo que yo haría.

En primer lugar voy a dejar de buscar la maritime_termscolección en la forma de hacer. En lugar de eso, voy a crear un documento que contendrá todos los términos que tiene almacenado en la base de datos. Cada término se añadirá en una serie de términos. De acuerdo con la longitud de los términos, es posible encajar en un solo documento todos los términos. Yo digo que debido a que los documentos tienen límites. Así que hay algunos límites cuando se trata de la cantidad de datos que puede poner en un documento. De acuerdo con la documentación oficial sobre el uso y límites :

Tamaño máximo para un documento: 1 MiB (1.048.576 bytes)

Como se puede ver, está limitado a 1 MiB total de datos en un solo documento. Cuando estamos hablando de almacenar texto, puede almacenar más o menos.

Si todos los términos no no caben en un solo documento, a continuación, sólo tiene que crear un documento para cada letra del alfabeto. Puesto que usted sabe lo que busca, será muy fácil saber qué documento a leer. Así que eche un vistazo al siguiente esquema:

Firestore-root
   |
   --- alphabetTerms (collection)
          |
          --- a (document)
          |   |
          |   --- aTerms: ["A-Term", "A-Term", "A-Term"]
          |
          --- b (document)
              |
              --- bTerms: ["B-Term", "B-Term", "B-Term"]

Para obtener el adocumento, simplemente obtener una referencia y hacer una get()llamada:

FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
DocumentReference aRef = rootRef.collection("alphabetTerms").document("a");
aRef.get().addOnCompleteListener(/* ... */);

Incluso si el la aTermses una matriz, cuando se hace una get()llamada, usted lo consigue como List<String>y no como una matriz. A continuación, puede buscar esa lista de cadenas utilizando:

termFromTheList.contains(searchedTerm);

Una cosa a destacar es que todos los términos deben estar en orden única de utilizar esta solución.

Esta solución es una solución mucho mejor que el que está utilizando en este momento ya que le permiten buscar una subcadena. Por ejemplo, si desea buscar en broad reachpara reach, esto no es posible, a menos que utilice un servicio de terceros como Algolia .

Una vez que encuentre una coincidencia, conseguirlo y crear una nueva consulta:

FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
CollectionReference maritimeTermsRef = rootRef.collection("maritime_terms");
Query searchQuery = maritimeTermsRef.whereEqualTo("term", searchedTerm);
searchQuery.get().addOnCompleteListener(/* ... */);

El uso de la solución anterior, usted termina encima de tener sólo un documento leído para encontrar el término en el documento y leyó un documento para mostrar los detalles del plazo.

Por lo que reduce el número de lecturas de 150 a solamente 2 .

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=316536&siteId=1
Recomendado
Clasificación