2014-09-05 25 views
6

Novità di Elasticsearch. Sono interessato solo a restituire i documenti più pertinenti e ho trovato min_score. Dicono "Nota, molte volte, questo non ha molto senso", ma non fornisce una ragione. Quindi, perché non ha senso usare min_score?Perché non utilizzare min_score con Elasticsearch?

MODIFICA: Quello che voglio veramente è restituire solo i documenti con un "punteggio" superiore a x. Ho questo:

data = { 
     'min_score': 0.9, 
     'query': { 
      'match': {'field': 'michael brown'}, 
     } 
    } 

C'è un'alternativa migliore a quanto sopra in modo che restituisca solo i documenti più rilevanti?

thx!

EDIT # 2: sto usando minimum_should_match e restituisce un errore 400:

"error": "SearchPhaseExecutionException[Failed to execute phase [query], all shards failed;" 

data = { 
     'query': { 
      'match': {'keywords': 'michael brown'}, 
      'minimum_should_match': '90%', 
     } 
    } 
+0

Non molto utile a meno che non si stiano calcolando da soli i punteggi per i risultati, e anche in questo caso è probabile che debbano essere completamente controllati dall'utente. Non ho mai usato min_score nonostante l'utilizzo degli aumenti del punteggio perché non mi sono mai preoccupato del punteggio minimo contro il minimo dovrebbe corrispondere. Uso solo il punteggio per l'ordinamento e la ricerca n in alto – coffeeaddict

+0

Ho anche provato a utilizzare minimum_should_match ma restituisce uno stato "400". Ho aggiornato la mia domanda. –

+0

come stai usando minimum_should_match? la cosa su min_score è cosa significa 0.9? come hai definito ciò che è "abbastanza buono" in base al punteggio (a meno che tu non stia generando quel punteggio usando una spinta/funzione) – coffeeaddict

risposta

4

ho usato min_score un bel po 'per cercare di trovare documenti che sono un match definitivo per un dato insieme di dati di input - che viene utilizzato per generare la query.

Il punteggio che ottieni per un documento dipende dalla query, ovviamente. Quindi direi di provare la tua query in molte permutazioni (diverse parole chiave, per esempio) e decidere quale documento è il primo che preferiresti non restituire per ciascuna, e prendere nota di ciascuno dei loro punteggi. Se i punteggi sono simili, ti darebbe una buona stima del valore da utilizzare per il tuo punteggio minimo.

Tuttavia, è necessario tenere presente che il punteggio non dipende solo dalla query e dal documento restituito, ma considera tutti gli altri documenti che contengono dati per i campi che si stanno interrogando. Ciò significa che se si prova il valore di min_score con un indice di 20 documenti, questo punteggio probabilmente cambierà notevolmente quando lo si proverà su un indice di produzione con, ad esempio, qualche migliaio di documenti o più. Questo cambiamento potrebbe andare in entrambi i modi e non è facilmente prevedibile.

Ho trovato per i miei usi di corrispondenza di min_score, è necessario creare una query piuttosto complessa e un set di analizzatori per ottimizzare i punteggi per i vari componenti della query. Ma ciò che è e non è incluso è di vitale importanza per la mia applicazione, quindi potresti essere felice di ciò che ti dà quando tieni le cose semplici.

2

Non so se è la soluzione migliore, ma funziona per me (java):

// "tiny" search to discover maxScore 
// it is fast, because it returns only 1 item 
SearchResponse response = client.prepareSearch(INDEX_NAME) 
         .setTypes(TYPE_NAME) 
         .setQuery(queryBuilder) 
         .setSize(1) 
         .execute() 
         .actionGet(); 

// get the maxScore and 
// and set minScore = 70% 
float maxScore = response.getHits().maxScore(); 
float minScore = maxScore * 0.7; 

// second round with minimum score 
SearchResponse response = client.prepareSearch(INDEX_NAME) 
         .setTypes(TYPE_NAME) 
         .setQuery(queryBuilder) 
         .setMinScore(minScore) 
         .execute() 
         .actionGet(); 

che cerco due volte, ma la prima volta è veloce perché restituisce solo 1 articolo, quindi abbiamo può ottenere il max_score

NOTA: minimum_should_match funziona in modo diverso. Se hai 4 query e dici minimum_should_match = 70%, ciò non significa che item.score dovrebbe essere> 70%. Ciò significa che l'elemento deve corrispondere al 70% delle query, ovvero minimo 3/4 query

Problemi correlati