Elasticsearch groovy脚本检查数组中的参数包含

时间:2016-09-01 00:56:36

标签: arrays elasticsearch groovy

我在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时所期望的结果相符,所以一切都是陷入其他声明。它是一个类型问题,语法?任何提示都非常感激。

1 个答案:

答案 0 :(得分:1)

这似乎是由于自动装箱引起的类型不匹配而发生的。

字段映射doc['field_name].valuesshortinteger类型的long似乎返回一个总是类型为'Long'且参数为{{1}的集合}被自动装箱到contains,导致Integer失败。

您可能会明确地将contains强制转换为Long类型:

示例:

current_user_id

或者更好地使用'find'方法

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