2015-08-17 21 views
8

Wiem, że elasticsearch bierze pod uwagę długość pola przy obliczaniu wyniku dokumentów wyszukanych przez zapytanie. Im krótsze pole, tym większa masa (patrz The field-length norm).Jak mogę zwiększyć normę długości pola w wyniku funkcji elastycznego wyszukiwania?

Podoba mi się to zachowanie: kiedy szukam iphone, jestem znacznie bardziej zainteresowany iphone 6 niż w Crappy accessories for: iphone 5 iphone 5s iphone 6.

Teraz chciałbym spróbować zwiększyć te rzeczy, powiedzmy, że chcę podwoić jego znaczenie.

Wiem, że można zmodyfikować wynik za pomocą function score, i myślę, że mogę osiągnąć to, co chcę, przez script score.

Próbowałem dodać kolejną normę pole długości do punktacji jak ten:

{ 
    "query": { 
     "function_score": { 
     "boost_mode": "replace", 
     "query": {...}, 
     "script_score": { 
      "script": "_score + norm(doc)" 
     } 
     } 
    } 
    } 

Ale nie udało mi się źle, otrzymuję ten błąd: [No parser for element [function_score]]

EDIT:

Mój pierwszy błąd był że nie zawinąłem wyniku funkcji w "zapytaniu". Teraz edytowałem powyższy kod. Mój nowy błąd mówi

GroovyScriptExecutionException[MissingMethodException 
[No signature of method: Script5.norm() is applicable for argument types: 
(org.elasticsearch.search.lookup.DocLookup) values: 
[<[email protected]>] 
Possible solutions: notify(), wait(), run(), run(), dump(), any()]] 

EDIT: I, pod warunkiem pierwszą odpowiedź, ale mam nadzieję na lepszy

Odpowiedz

8

Wygląda na to, że można to osiągnąć przy użyciu pola type token_count wraz z field_value_factor function score.

Tak, coś takiego w odwzorowaniu pola:

"name": { 
    "type": "string", 
    "fields": { 
    "length": { 
     "type":  "token_count", 
     "analyzer": "standard" 
    } 
    } 
} 

ten użyje liczbę żetonów w tej dziedzinie. Jeśli chcesz użyć liczby znaków, możesz zmienić analizator z standard na niestandardowy, który tokenizuje każdą postać.

Następnie w zapytaniu:

"function_score": { 
    ..., 
    "field_value_factor": { 
    "field": "name.length", 
    "modifier": "reciprocal" 
    } 
} 
3

mam coś tego rodzaju prac. Biorąc pod uwagę, odliczam długość pola zainteresowania z wyniku.

{ 
"query": { 
    "function_score": { 
    "boost_mode": "replace", 
    "query": {...}, 
    "script_score": { 
     "script": "_score - doc['<field_name>'].value.length()" 
    } 
    } 
} 
} 

Nie mogę kontrolować względnej wagi tej liczby, którą odejmuję, w porównaniu do poprzedniego wyniku. Dlatego nie akceptuję odpowiedzi: na jakiś czas poczekam na lepsze. Najlepiej byłoby, gdyby udało mi się uzyskać dostęp do funkcji field length norm w obrębie script_score lub uzyskać równoważny wynik.