Question

Je voudrais utiliser CouchDB pour stocker des données pour moi, puis utiliser des appels api RESTful pour obtenir les données dont j'ai besoin. Ma base de données s'appelle " test " et mes documents ont tous une structure similaire et ressemblent à ceci (où hello_world est l'identifiant du document):

"hello_world" : {"id":123, "tags":["hello", "world"], "text":"Hello World"}
"foo_bar" :{"id":124, "tags":["foo", "bar"], "text":"Foo Bar"} 

Ce que j'aimerais pouvoir faire, c'est que mes utilisateurs envoient une requête telle que: "Donnez-moi tous les documents contenant les mots" hello world ", par exemple. J'ai joué avec les points de vue, mais il semblerait qu'ils ne me permettront que de déplacer une ou plusieurs de ces valeurs dans la "clé". partie de la fonction de la carte. Cela me donne la possibilité de faire quelque chose comme ceci:

  

http: // localhost: 5984 / test / _design / search / _view / search_view? key = "bonjour"

Mais cela ne me permet pas de laisser mes utilisateurs spécifier leur chaîne de requête. Par exemple, s’ils recherchaient "bonjour le monde". Je devrais faire deux requêtes: une pour "Bonjour". et un pour " monde " alors je devrais écrire un tas de javascript pour combiner les résultats, supprimer les doublons, etc. (YUCK!). Ce que je veux vraiment, c'est pouvoir faire quelque chose comme ça:

  

http: // localhost: 5984 / test / _design / search / _view / search_view? term = " hello world "

Utilisez ensuite le paramètre " hello world " Dans les vues, les fonctions de cartographie / réduction permettent de rechercher tous les documents contenant à la fois "bonjour". et " world " dans le tableau de tags. Est-ce que ce genre de chose est même possible avec CouchDB? Y a-t-il un autre moyen de réaliser cela dans une vue à laquelle je ne pense pas?

Était-ce utile?

La solution

Les vues CouchDB ne prennent pas en charge la recherche par facettes, la recherche en texte intégral ou l’intersection des résultats. Le plugin couchdb-lucene vous permet de faire toutes ces choses.

http://github.com/rnewson/couchdb-lucene/tree/master

Autres conseils

Techniquement, cela est possible si vous émettez pour chaque document chaque ensemble du pouvoir des étiquettes du document en tant que clé. L'élément de jeu de clés doit être commandé et votre requête doit également interroger les balises commandées.

function map(doc) {
  function powerset(array) { ... }

  powerset_of_tags = powerset(doc.tags)
  for(i in powerset_of_tags) {
    emit(powerset_of_tags[i], doc);
  }
}

pour la doc {" hello_world " : {"id": 123, "tags": ["bonjour", "monde"], "texte": "Hello World"} cela émettrait:

{ key: [], doc: ... }
{ key: ['hello'], doc: ... }
{ key: ['world'], doc: ... }
{ key: ['hello', 'world'], doc: ... }

Bien que cela soit possible, j’estime qu’il s’agit d’une solution plutôt maladroite Je ne veux pas imaginer l'utilisation de la vue par le disque pour un plus grand nombre de balises. Je m'attends à ce que le nombre de clés émises augmente de 2 ^ n.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top