2013-07-08 25 views
9

Quello che sto cercando è una spiegazione chiara e chiara di come funziona davvero il meccanismo di punteggio predefinito di ElasticSearch (Lucene). Voglio dire, usa il punteggio di Lucene, o forse usa un punteggio proprio?Meccanismo di punteggio predefinito ElasticSearch

Ad esempio, desidero cercare il documento, ad esempio, nel campo "Nome". Uso il client .NET NEST per scrivere le mie domande. Prendiamo in considerazione questo tipo di query:

IQueryResponse<SomeEntity> queryResult = client.Search<SomeEntity>(s => 
    s.From(0) 
    .Size(300) 
    .Explain() 
    .Query(q => q.Match(a => a.OnField(q.Resolve(f => f.Name)).QueryString("ExampleName"))) 
); 

che si traduce a tale interrogazione JSON:

{ 
"from": 0, 
"size": 300, 
"explain": true, 
"query": { 
    "match": { 
    "Name": { 
     "query": "ExampleName" 
     } 
    } 
    } 
} 

V'è di circa 1,1 milioni di documenti che la ricerca viene eseguita su. Quello che ricevo in cambio, è (che è solo una parte del risultato, formattato per conto mio):

650 "ExampleName" 7,313398 

651 "ExampleName" 7,313398 

652 "ExampleName" 7,313398 

653 "ExampleName" 7,239194 

654 "ExampleName" 7,239194 

860 "ExampleName of Something" 4,5708737 

cui primo campo è solo un ID, secondo è Nome campo su cui elasticsearch eseguita è la ricerca, e la terza è il punteggio.

Come potete vedere, ci sono molti duplicati nell'indice ES. Dato che alcuni dei documenti trovati hanno un punteggio diverso, nonostante siano esattamente gli stessi (con solo Id diffrent), ho concluso che frammenti diversi eseguivano ricerche su parti differenti dell'intero set di dati, il che mi porta a seguire che il punteggio è in qualche modo basato sull'intero dati in frammenti dati, non solo su documento effettivamente considerato dal motore di ricerca.

La domanda è: come funziona esattamente questo punteggio? Voglio dire, potresti dirmi/mostrami/indicarmi la formula esatta per calcolare il punteggio per ogni documento trovato da ES? E alla fine, come si può cambiare questo meccanismo di punteggio?

risposta

11

Il punteggio predefinito è l'algoritmo DefaultSimilarity nel core Lucene, largely documented here. È possibile personalizzare il punteggio configurando your own Similarity o utilizzando qualcosa come custom_score query.

La variazione del punteggio dispari nei primi cinque risultati mostrati sembra abbastanza piccola da non interessarmi molto, per quanto riguarda la validità dei risultati della query e il loro ordine, ma se vuoi capirne la causa, il explain api può mostrarti esattamente cosa sta succedendo lì.

+0

OK, questo copre praticamente ciò che volevo sapere. L'informazione che ES sta usando puramente la similarità di Lucene è molto utile. Grazie! –

+0

Ulteriori dettagli sui fattori nell'algoritmo di punteggio di Lucene: http://www.lucenetutorial.com/advanced-topics/scoring.html – ThoQ

2

La variazione del punteggio si basa sui dati in un dato frammento (come si sospetta). Per impostazione predefinita, ES utilizza un tipo di ricerca chiamato "query quindi preleva" che, invia la query a ciascun frammento, trova tutti i documenti corrispondenti con punteggi utilizzando TDIF locali (questo varierà in base ai dati su un determinato frammento - ecco il tuo problema) .

È possibile modificare questo utilizzando 'interrogazione DFS poi prendere' cerca - prequery ogni frammento chiedendo frequenze termine e di documenti e quindi invia una query per ogni frammento, ecc ..

È possibile impostare l'URL

$ curl -XGET '/index/type/search?pretty=true&search_type=dfs_query_then_fetch' -d '{ 
    "from": 0, 
    "size": 300, 
    "explain": true, 
    "query": { 
    "match": { 
     "Name": { 
     "query": "ExampleName" 
     } 
    } 
    } 
}'