簡體   English   中英

Elasticsearch groovy腳本檢查數組中的參數包含

[英]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語句中。 它是一個類型問題,語法? 任何提示非常感謝。

這似乎是由於自動裝箱引起的類型不匹配而發生的。

用於字段映射shortintegerlong類型的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM