2016-09-01 10 views
5

Używam elasticsearch (v2.0.0) do wyszukiwania w Railsach i chcę dodać do naszego niestandardowego skryptu do oceniania, ale albo zepsuję składnię, albo po prostu coś brakuje. w całości. Wszystko działa bez sprawdzania w skrypcie dla tablicy, więc to jedyna część, która nie działa.Elasticsearch groovy skrypt do sprawdzania parametrów w tablicy

Więc dla indeksu recipe_user_ids jest tablicą liczb całkowitych:

indexes :recipe_user_ids, type: 'integer' 

Następnie w zapytaniu określić parametr dla pliku skryptu i który plik skryptu:

functions: [{ 
    script_score: { 
    params: { current_user_id: user.id }, 
    script_file: 'ownership_script' 
    } 
}] 

a owner-script.groovy file:

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 

Nie dostaję żadnych błędów, ale Rezultaty nie wydają się pasować do tego, czego oczekiwałbym, gdy tablica recipe_user_ids zawierała current_user_id, więc wszystko sprowadza się do instrukcji else. Czy jest to problem typu, składnia? Wszelkie wskazówki bardzo doceniane.

+0

Jaka jest poprawna nazwa tego pola: 'recipes_user_ids' lub 'recipe_user_ids'? Masz tam oba imiona ... – Val

+0

Niestety, to był literówka w poście, a nie kod! Edytowane. – Lev

+0

Skąd pochodzi wartość 'user.id' w parametrach skryptu? Jaką wersję ES używasz? – Val

Odpowiedz

1

Wydaje się, że to się zdarza z powodu niedopasowania typu spowodowanego przez autoboxing.

doc['field_name].values do mapowania pola short, integer, long typy wydaje się być powrocie zbiór zawsze typu „Długi”, a argument contains jest autoboxed do Integer powodując contains na niepowodzenie.

można prawdopodobnie explictly cast current_user_id do typu Long:

Przykład:

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

Albo lepiej użyć 'odnaleźć' metoda

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

+0

Myślę, że trzeba usunąć nawias wokół zamknięcia 'find'. – Val

+0

@Val strange works for me! jaki błąd rzuca? – keety

+0

możesz zachować '(...)', ale nie jest to konieczne w groovy – Val

Powiązane problemy