2015-08-17 25 views
8

So che elasticsearch tiene conto della lunghezza di un campo quando si calcola il punteggio dei documenti recuperati da una query. Più corto è il campo, maggiore è il peso (vedere The field-length norm).Come posso aumentare la norma della lunghezza del campo nel punteggio della funzione elasticsearch?

Mi piace questo comportamento: quando cerco iphone sono molto più interessato a iphone 6 rispetto a Crappy accessories for: iphone 5 iphone 5s iphone 6.

Ora, vorrei provare ad aumentare questa roba, diciamo che voglio raddoppiare la sua importanza.

So che è possibile modificare il punteggio utilizzando lo function score e credo di poter ottenere ciò che voglio tramite script score.

ho cercato di aggiungere un altro norma di campo di lunghezza per il punteggio in questo modo:

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

Ma non sono riuscito male, questo errore: [No parser for element [function_score]]

EDIT:

Il mio primo errore è stato che non avevo avvolto il punteggio della funzione in una "query". Ora ho modificato il codice qui sopra. Il mio nuovo errore dice

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: ho fornito una prima risposta, ma sto sperando in una migliore

risposta

8

Sembra che si possa ottenere ciò utilizzando un campo di type token_count insieme a un field_value_factor function score.

Quindi, qualcosa di simile nella mappatura campo:

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

Questa utilizzerà il numero di gettoni nel campo. Se si desidera utilizzare il numero di caratteri, è possibile cambiare l'analizzatore da standard a uno personalizzato che esegue il token di ciascun carattere.

Poi nella query:

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

ho qualcosa che tipo di opere. Con quanto segue, deduco la lunghezza di un campo di mio interesse dal punteggio.

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

Hovever, Non posso controllare il peso relativo di questo numero che sto sottraendo, rispetto al vecchio punteggio. Ecco perché non accetto la mia risposta: aspetterò quelli migliori per un po '. Idealmente, mi piacerebbe avere un modo per accedere alla funzione field length norm all'interno dello script_score, o per ottenere un risultato equivalente.