2013-06-03 4 views
2

J'ai un programme java, qui lit tous les mots d'un fichier PDF. J'ai sauvé les mots avec les pagenumbers dans une base de données (couchDB). Maintenant, je veux écrire une carte et une fonction de réduction, qui liste chaque mot avec les numéros de page où le mot se produit, mais si les mots se produisent plus d'une fois sur une page, je veux juste une entrée. Le résultat devrait être une ligne avec mot et une deuxième ligne avec une liste (chaîne séparée par une virgule) de pagenumbers. Chaque mot avec le numéro de page est un document séparé dans couchDB. Comment est-ce que je peux faire ceci avec une fonction map-reduce (filtrez les mêmes entrées de pagenumbers)? Merci pour votre aide.fonction map-reduce dans CouchDB

Répondre

4

Sûrement il y a plus d'une façon de le faire. J'irais pour quelque chose de simple. Disons que vos documents ressemblent un peu à ceci:

{ 'type': 'word-index', 'word': 'Great', 'page_number': 45 } 

Ceci est le résultat de trouver le mot « grand » à la page 45. Maintenant, l'index de vue est créée par une fonction de vue:

function map(doc) { 
    if (doc.type == 'word-index') { 
     emit([doc.word, doc.page_number], null); 
    } 
} 

Pour réduisez la partie utilisez juste le "_count" intégré. Maintenant, pour obtenir la liste de toutes les occurrences du mot "Great" dans votre livre, il suffit d'interroger votre vue avec startkey = ["Great"] et endkey = ["Great", {}]. Maintenant, le résultat ressemblerait un peu comme:

["Great", 45], 4 
["Great", 70], 7 

Ce qui signifie que monde « Great » est apparu 4 fois à la page 45 et 7 fois à la page 70. Vous pouvez extraire votre liste séparée par des virgules vous avez besoin de lui. Le nombre d'occurrences est un bonus.

--edit--

Vous devez également utiliser group_level = 2 dans votre requête. Si vous ne faites pas le résultat de la requête serait simplement une seule ligne avec le décompte de tous les documents que vous avez.

+0

Merci pour votre réponse rapide. Je dois le tester plus tard, mais si je veux une liste: Great 45, 70, 234. le mot great ne devrait figurer qu'une seule fois. Et la fonction devrait le faire pour tous les mots (documents) dans la base de données. – user2447116

+0

Comment puis-je gérer avec une fonction de réduction pour filtrer les multiples numéros de page? – user2447116

+0

Eh bien, je ne sais pas Java, ou les liaisons api pour couchdb. Mon point est que lorsque vous interrogez une vue comme celle-ci, vous recevrez la liste des paires clé-valeur. Vos clés sont de la forme ["World", page_number]. Pour obtenir la liste, vous devez simplement prendre toutes les lignes avec les clés ayant le même premier élément et extraire la seconde. Merci de le réduire, c'est unique. Juste une chose de plus que je viens de réaliser, vous devez également utiliser group_level = 2 à votre requête pour obtenir ce résultat. Si vous ne le faites pas, vous obtiendrez une seule ligne dans le résultat. –