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

Lev*_*Lev 5 arrays groovy elasticsearch

我正在使用elasticsearch(v2.0.0)在Rails中进行搜索,并希望添加到我们的自定义脚本中进行评分,但我要么弄乱语法,要么完全缺少其他内容.这一切都可以在没有检查数组的脚本的情况下工作,因此这是唯一不起作用的部分.

所以对于索引,recipe_user_ids是一个整数数组:

indexes :recipe_user_ids, type: 'integer'
Run Code Online (Sandbox Code Playgroud)

然后在搜索查询中,我指定脚本文件的参数和哪个脚本文件:

functions: [{
  script_score: {
    params: { current_user_id: user.id },
    script_file: 'ownership_script'
  }
}]
Run Code Online (Sandbox Code Playgroud)

和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
Run Code Online (Sandbox Code Playgroud)

我没有得到任何错误,但结果似乎与我在recipe_user_ids数组确实包含时所期望的结果相匹配current_user_id,因此一切都落入了else语句中.它是一个类型问题,语法?任何提示非常感谢.

kee*_*ety 1

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

fordoc['field_name].values字段映射short, integer,long类型似乎始终返回“Long”类型的集合,并且 的参数被contains自动装箱以Integer导致contains失败。

您可能可以显式转换current_user_id为 Long 类型:

例子:

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

或者更好地使用“查找”方法

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