我在Rails中使用elasticsearch(v2.0.0)进行搜索,并希望添加到我们的自定义脚本中进行评分,但我要弄乱语法或者完全错过其他内容。这一切都可以在没有检查阵列的脚本的情况下工作,因此这是唯一没有工作的部分。
因此对于索引,recipe_user_ids
是一个整数数组:
indexes :recipe_user_ids, type: 'integer'
然后在搜索查询中,我指定脚本文件的参数和哪个脚本文件:
functions: [{
script_score: {
params: { current_user_id: user.id },
script_file: 'ownership_script'
}
}]
owner-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
时所期望的结果相符,所以一切都是陷入其他声明。它是一个类型问题,语法?任何提示都非常感激。
答案 0 :(得分:1)
这似乎是由于自动装箱引起的类型不匹配而发生的。
字段映射doc['field_name].values
,short
,integer
类型的long
似乎返回一个总是类型为'Long'且参数为{{1}的集合}被自动装箱到contains
,导致Integer
失败。
您可能会明确地将contains
强制转换为Long类型:
示例:强>
current_user_id
或者更好地使用'find'方法
doc['recipe_user_ids'].values.contains(new Long(current_user_id))