2016-09-01 5 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' 
    } 
}] 

そして、 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文に該当します。それは型問題、構文ですか?任意のヒントを大いに感謝します。

+0

を使用するには、そのフィールドの正しい名前は何ですか: 'recipes_user_ids'または'recipe_user_ids'?あなたはそこに両方の​​名前を持っています... – Val

+0

申し訳ありません、それは、コードではなく、投稿のタイプミスでした!編集されました。 – Lev

+0

'user.id'の値はスクリプトのパラメータのどこから来ますか?そして、どのESのバージョンを実行していますか? – Val

答えて

1

これは、オートボックスによるタイプのミスマッチのために発生しているようです。

フィールドマッピングshortためdoc['field_name].valuesintegerlongのタイプは「ロング」タイプのいつものコレクションを返しているように見えるとcontainsへの引数はcontainsが失敗する原因Integerにautoboxedされます。

おそらく、明示的にロングのタイプに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

関連する問題