2013-07-17 72 views
0

我是Grails新手。我正在使用Mahout Recommender Plugin來創建推薦引擎。我正在關注這個tutorial。這對我來說可以。Grails Mahout插件與後臺作業(quartz2)

現在我正在嘗試做什麼,我只是想做這個使用後臺作業的Mahout推薦。這樣用戶可以根據他們喜歡的內容自動推薦。我使用Quartz 2.x Scheduler作爲後臺工作目的。我如何使用Mahout作爲後臺作業?

在這個tutorial,你可以看到我已經創建了一個PrefrenceController.groovy,我在其中添加了userID,itemID和prefrence數字。

我Prefrence.groovy域類文件 -

package com.rbramley.mahout 

import org.apache.commons.lang.builder.HashCodeBuilder 

class Preference implements Serializable { 
    long userId 
    long itemId 
    float prefValue 

    static constraints = { 
     userId() 
     itemId() 
     prefValue range: 0.0f..5.0f 
    } 

    boolean equals(other) { 
     if(!(other instanceof Preference)) { 
     return false 
     } 

    other.userId == userId && other.itemId == itemId 
    } 

    int hashCode() { 
     def builder = new HashCodeBuilder() 
     builder.append userId 
     builder.append itemId 
     builder.toHashCode() 
    } 

    static mapping = { 
     id composite: ['userId', 'itemId'] 
     version false 
    } 
    } 

和我PrefrenceController.groovy

package com.rbramley.mahout 

import org.springframework.dao.DataIntegrityViolationException 

class PreferenceController { 

    static allowedMethods = [save: "POST", update: "POST", delete: "POST"] 

    def index() { 
     redirect(action: "list", params: params) 
    } 

    def list(Integer max) { 
     params.max = Math.min(max ?: 10, 100) 
     [preferenceInstanceList: Preference.list(params), preferenceInstanceTotal: Preference.count()] 
    } 

    def create() { 
     [preferenceInstance: new Preference(params)] 
    } 

    def save() { 
     def preferenceInstance = new Preference(params) 
     if (!preferenceInstance.save(flush: true)) { 
      render(view: "create", model: [preferenceInstance: preferenceInstance]) 
      return 
     } 

    flash.message = message(code: 'default.created.message', args: [message(code: 'preference.label', default: 'Preference'), preferenceInstance.id]) 
    redirect(action: "show", id: preferenceInstance.id) 
    } 

    def show(Long id) { 
     def preferenceInstance = Preference.get(id) 
     if (!preferenceInstance) { 
     flash.message = message(code: 'default.not.found.message', args: [message(code: 'preference.label', default: 'Preference'), id]) 
     redirect(action: "list") 
     return 
    } 

    [preferenceInstance: preferenceInstance] 
    } 

    def edit(Long id) { 
    def preferenceInstance = Preference.get(id) 
    if (!preferenceInstance) { 
     flash.message = message(code: 'default.not.found.message', args: [message(code: 'preference.label', default: 'Preference'), id]) 
     redirect(action: "list") 
     return 
    } 

    [preferenceInstance: preferenceInstance] 
    } 

    def update(Long id, Long version) { 
    def preferenceInstance = Preference.get(id) 
    if (!preferenceInstance) { 
     flash.message = message(code: 'default.not.found.message', args: [message(code: 'preference.label', default: 'Preference'), id]) 
     redirect(action: "list") 
     return 
    } 

    if (version != null) { 
     if (preferenceInstance.version > version) { 
      preferenceInstance.errors.rejectValue("version", "default.optimistic.locking.failure", 
         [message(code: 'preference.label', default: 'Preference')] as Object[], 
         "Another user has updated this Preference while you were editing") 
      render(view: "edit", model: [preferenceInstance: preferenceInstance]) 
      return 
     } 
    } 

    preferenceInstance.properties = params 

    if (!preferenceInstance.save(flush: true)) { 
     render(view: "edit", model: [preferenceInstance: preferenceInstance]) 
     return 
    } 

    flash.message = message(code: 'default.updated.message', args: [message(code: 'preference.label', default: 'Preference'), preferenceInstance.id]) 
    redirect(action: "show", id: preferenceInstance.id) 
} 

def delete(Long id) { 
    def preferenceInstance = Preference.get(id) 
    if (!preferenceInstance) { 
     flash.message = message(code: 'default.not.found.message', args: [message(code: 'preference.label', default: 'Preference'), id]) 
     redirect(action: "list") 
     return 
    } 

    try { 
     preferenceInstance.delete(flush: true) 
     flash.message = message(code: 'default.deleted.message', args: [message(code: 'preference.label', default: 'Preference'), id]) 
     redirect(action: "list") 
    } 
    catch (DataIntegrityViolationException e) { 
     flash.message = message(code: 'default.not.deleted.message', args: [message(code: 'preference.label', default: 'Preference'), id]) 
     redirect(action: "show", id: id) 
    } 
} 
} 

假設我有我的數據庫中手動添加一些數據。現在,當用戶點擊RecommendController並放置特定的用戶ID時,它將顯示建議。但我想把它作爲背景Job。 建議應自動向所有用戶建議,無需任何人爲干預。

+0

你說'我只想做使用後臺JOB'你想爲你的工作待辦事項你能在此擴大這種亨利馬烏建議? – Alidad

+0

現在我只能通過填寫Mahout Plugin提供的推薦表單向特定用戶推薦。但通過手動填充UserID然後給予建議並不好。它應該在後臺,以便用戶可以根據自己的喜好自動查看他們的建議。 –

回答

0

如果我理解你的問題,你需要一個按需的工作,你可以從你的控制器運行它。要做到這一點,創建一個沒有任何觸發器的工作,那麼你可以從你的Controller手動觸發它並傳入你的參數。這將在後臺觸發工作。在執行定義工作需要做什麼的時候,你也可以將你需要的任何服務注入到這個工作中。

控制器:

BackgroundJob.triggerNow([id:params.id,userId:userId]) 

工作

class BackgroundJob { 
    static triggers = {} 

    def execute(context) { 
     def id = context.mergedJobDataMap.get('id') 
     def userId = context.mergedJobDataMap.get('userId') 
     ... 
    } 
} 
+0

感謝您的回覆。我正在使用Mahout推薦插件進行推薦。但我無法在我的工作目錄中找到控制器。我希望用戶自動獲得建議(基於他們喜歡的內容)。例如,在亞馬遜,建議您根據您購買或喜歡的書籍購買書籍。 –