2016-09-01 55 views
5

我在Rails中使用elasticsearch(v2.0.0)進行搜索,並希望添加到我們的自定義腳本中進行評分,但我要麼搞亂了語法,其他完全。這一切都沒有在數組的腳本中檢查,所以這是唯一不起作用的部分。Elasticsearch groovy腳本來檢查參數包含在數組中

所以對於指數,recipe_user_ids是一個整數數組:

indexes :recipe_user_ids, type: 'integer' 

然後在搜索查詢我指定的腳本文件和腳本文件中的參數:

functions: [{ 
    script_score: { 
    params: { current_user_id: user.id }, 
    script_file: 'ownership_script' 
    } 
}] 

而所有權script.groovy文件:

if (current_user_id == doc['user_id'].value) { owner_modifier = 1.0 } else { owner_modifier = 0.0 } 
if (doc['recipe_user_ids'].values.contains(current_user_id)) { recipe_user_modifier = 50.0 } else { recipe_user_modifier = 0.0 } 
(_score + (doc['score_for_sort'].value + owner_modifier + recipe_user_modifier)*5)/_score 

我沒有得到任何錯誤,但th當recipe_user_ids數組包含current_user_id時,e結果似乎不符合我的預期,因此所有內容都落入else語句中。它是一個類型問題,語法?任何提示不勝感激。

+0

什麼是該字段的正確名稱:'recipes_user_ids'或'recipe_user_ids'?你有兩個名字在那裏... – Val

+0

對不起,這是一個錯誤的帖子,而不是代碼!編輯。 – Lev

+0

'user.id'值來自您的腳本參數?你在運行什麼版本的ES? – Val

回答

1

這似乎是由於自動裝箱造成的類型不匹配而發生的。

doc['field_name].values的字段映射shortintegerlong類型似乎型總是返回集合「長」和參數contains被autoboxed到Integer造成contains失敗。

你也許可以顯式地投current_user_id龍的類型:

例子:

doc['recipe_user_ids'].values.contains(new Long(current_user_id))

或者最好使用 '查找' 方法

doc['recipe_user_ids'].values.find {it == current_user_id}

+0

我想你需要刪除'find'閉包的括號。 – Val

+0

@Val對我來說很奇怪!它拋出什麼錯誤? – keety

+0

你可以保留'(...)',但它沒有必要在groovy – Val