[英]Elasticsearch groovy script to check parameter inclusion in array
我正在使用elasticsearch(v2.0.0)在Rails中進行搜索,並希望添加到我們的自定義腳本中進行評分,但我要么弄亂語法,要么完全缺少其他內容。 這一切都可以在沒有檢查數組的腳本的情況下工作,因此這是唯一不起作用的部分。
因此對於索引, recipe_user_ids
是一個整數數組:
indexes :recipe_user_ids, type: 'integer'
然后在搜索查詢中,我指定腳本文件的參數和哪個腳本文件:
functions: [{
script_score: {
params: { current_user_id: user.id },
script_file: 'ownership_script'
}
}]
和ownership-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
我沒有收到任何錯誤,但是當recipe_user_ids
數組確實包含current_user_id
,結果似乎與我期望的結果不匹配,所以一切都落入了else語句中。 它是一個類型問題,語法? 任何提示非常感謝。
這似乎是由於自動裝箱引起的類型不匹配而發生的。
用於字段映射short
, integer
, long
類型的doc['field_name].values
似乎返回一個總是類型為'Long'的集合,而contains
的參數將自動提交給Integer
導致contains
失敗。
您可能會明確地將current_user_id
轉換為Long類型:
例:
doc['recipe_user_ids'].values.contains(new Long(current_user_id))
或者更好地使用'find'方法
doc['recipe_user_ids'].values.find {it == current_user_id}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.