2013-06-03 270 views
2

我有一個java程序,它讀取PDF文件的所有單詞。我用頁面編號將數據保存在數據庫(couchDB)中。現在我想編寫一個地圖和一個縮減函數,它將每個單詞與出現單詞的頁碼一起列出,但是如果單詞在頁面上出現多次,我只需要一個條目。結果應該是一個帶有單詞的行,第二行帶有一個用逗號分隔的列表(用逗號分隔的字符串)。每個帶pagenumber的單詞在couchDB中是一個單獨的文檔。 如何使用map-reduce函數(篩選頁面編號的相同條目)執行此操作? 感謝您的幫助。CouchDB中的map-reduce函數

回答

4

當然有不止一種方法。我會去做一些簡單的事情。比方說你的文檔看起來有點像這樣:

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

這是找到第45頁現在您的視圖索引由視圖函數創建上的字「大」的結果:

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

對於減少部分只是使用「_count」內置。

現在要在您的書中獲得單詞「Great」的所有出現的列表,只需使用startkey = [「Great」]和endkey = [「Great」,{}]查詢您的視圖。現在,結果看起來就會有點像:

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

這意味着世界「的」出現45頁的4倍和70頁的7倍,您可以提取您的逗號分隔你從它需要的清單。發生次數是獎金。

- 編輯 -

您還可以在查詢中使用group_level = 2。如果你不這樣做,查詢的結果只會是單一行,並且你的所有文檔都被計數。

+0

感謝您快速回答。我必須在稍後測試它,但如果我想要一個列表:偉大的45,70,234.偉大的字應該只列出一次。並且該函數應該爲數據庫中的所有單詞(文檔)執行此操作。 – user2447116

+0

如何使用reduce函數來管理多個頁面編號? – user2447116

+0

嗯,我不知道Java,或者couchdb的api綁定。我的觀點是,當你查詢這樣的視圖時,你會得到鍵值對的列表。你的密鑰的形式是[「World」,page_number]。要獲取列表,您只需將所有行的鍵與第一個元素相同並提取第二個元素。由於減少了它,它的獨特性。 我剛剛意識到的還有一件事,您還需要使用group_level = 2來查詢您的查詢結果。如果你不這樣做,你會在結果中得到一行。 –