web-dev-qa-db-fra.com

Comment effectuer l'opération "LIKE" de SQL sur firebase?

J'utilise firebase pour le stockage de données. La structure de données est comme ceci:

products:{
   product1:{
      name:"chocolate",
   }
   product2:{
      name:"chochocho",
   }
}

Je veux effectuer une opération de complétion automatique pour ces données, et normalement j'écris la requête comme ceci:

"select name from PRODUCTS where productname LIKE '%" + keyword + "%'";

Donc, dans mon cas, par exemple, si l'utilisateur tape "cho", je dois apporter à la fois "chocolat" et "chochocho". J'ai pensé à placer toutes les données sous le bloc "produits", puis à interroger le client, mais cela peut nécessiter beaucoup de mémoire pour une base de données volumineuse. Alors, comment puis-je effectuer l'opération SQL LIKE?

Merci

40
yrazlik

Mise à jour: Avec la sortie de Cloud Functions for Firebase, il existe un autre moyen élégant de le faire également par reliant Firebase à Algolia via Functions . Le compromis ici est que le module Functions/Algolia ne nécessite pratiquement aucune maintenance, mais son coût est probablement plus élevé que celui de Node.

Il n’existe actuellement aucune recherche de contenu dans Firebase. La plupart des scénarios de recherche les plus courants, tels que la recherche par attribut, seront intégrés à Firebase à mesure que l'API continue de se développer.

En attendant, il est certainement possible de cultiver le vôtre. Cependant, la recherche est un sujet vaste (pensez à créer un vaste magasin de données en temps réel), grandement sous-estimé, et une fonctionnalité essentielle de votre application - vous ne devez en aucun cas l'adapter ou même compter sur une personne comme Firebase . Il est donc généralement plus simple d’utiliser un outil tiers évolutif pour gérer l’indexation, la recherche, la correspondance balise/modèle, la logique floue, les classements pondérés, etc.

Le blog Firebase contient un article de blog sur l'indexation avec ElasticSearch } qui décrit une approche simple pour intégrer un moteur de recherche rapide, mais extrêmement puissant, dans votre backend Firebase.

Essentiellement, cela se fait en deux étapes. Surveillez les données et indexez-les:

var Firebase = require('firebase');
var ElasticClient = require('elasticsearchclient')

// initialize our ElasticSearch API
var client = new ElasticClient({ Host: 'localhost', port: 9200 });

// listen for changes to Firebase data
var fb = new Firebase('<INSTANCE>.firebaseio.com/widgets');
fb.on('child_added',   createOrUpdateIndex);
fb.on('child_changed', createOrUpdateIndex);
fb.on('child_removed', removeIndex);

function createOrUpdateIndex(snap) {
   client.index(this.index, this.type, snap.val(), snap.name())
     .on('data', function(data) { console.log('indexed ', snap.name()); })
     .on('error', function(err) { /* handle errors */ });
}

function removeIndex(snap) {
   client.deleteDocument(this.index, this.type, snap.name(), function(error, data) {
      if( error ) console.error('failed to delete', snap.name(), error);
      else console.log('deleted', snap.name());
   });
}

Interrogez l'index lorsque vous souhaitez effectuer une recherche:

<script src="elastic.min.js"></script>
 <script src="elastic-jquery-client.min.js"></script>
 <script>
    ejs.client = ejs.jQueryClient('http://localhost:9200');
    client.search({
      index: 'firebase',
      type: 'widget',
      body: ejs.Request().query(ejs.MatchQuery('title', 'foo'))
    }, function (error, response) {
       // handle response
    });
 </script>

_ { Il y a un exemple et une bibliothèque tierce pour simplifier l'intégration, ici. }

24
Kato

Je crois que tu peux faire: 

admin
.database()
.ref('/vals')
.orderByChild('name')
.startAt('cho')
.endAt("cho\uf8ff")
.once('value')
.then(c => res.send(c.val()));

ceci trouvera des vals dont le nom commence par cho. 

la source

11
Ced

La solution de recherche élastique consiste essentiellement à ajouter set del et offre un moyen par lequel vous pouvez effectuer des recherches de texte . Elle enregistre ensuite le contenu dans mongodb.

Bien que j'aime et recommande la recherche élastique pour la maturité du projet, la même chose peut être faite sans un autre serveur, en utilisant uniquement la base de données firebase . C'est ce que je veux dire: ( https://github.com/metaschema/oxyzen )

pour la partie indexation essentiellement la fonction:

  1. JSON stringise un document.
  2. supprime tous les noms de propriétés et JSON pour ne laisser que les données (regex).
  3. supprime tous les tags xml (donc aussi le html) et les attributs (rappelez-vous old guidance, "les données ne doivent pas figurer dans les attributs xml") pour ne laisser que le texte pur si xml ou html était présent.
  4. supprime tous les caractères spéciaux et les remplace par un espace (regex)
  5. substitue toutes les occurrences d'espaces multiples avec un espace (regex)
  6. se divise en espaces et cycles:
  7. pour chaque mot ajoute des références au document dans une structure d'index dans votre base de données contient essentiellement des enfants nommés avec des mots avec des enfants nommés avec une version échappée de "ref/inthedatabase/dockey"
  8. insère ensuite le document comme une application normale de Firebase ferait

dans l'implémentation oxyzen, les mises à jour ultérieures du document lisent ACTUELLEMENT l'index et le mettent à jour, en supprimant les mots qui ne correspondent plus et en ajoutant les nouveaux.

les recherches ultérieures de mots peuvent trouver directement des documents dans les mots enfant. la recherche de mots multiples est mise en oeuvre à l'aide de hits

0
user3191409