14

Ho fatto una query complessa utilizzando la popolarità per migliorare i risultati dei documenti sui social media utilizzando Elasticsearch. La query funziona davvero bene ei risultati principali sono sempre centrati sulla query e con elementi interessanti.Risultati diversificati sulla ricerca Elasticsearch

Tuttavia ha un problema, per alcune query i primi risultati sono tutti dallo stesso utente.

Mi piacerebbe downscore un documento se lo stesso utente è stato recuperato su un documento più alto. In questo modo mi aspetto di avere più diversificazione dei risultati.

Nota che non voglio che vengano rimossi, poiché in alcuni casi potrebbe essere ancora interessante trovare più documenti dello stesso utente, ma vorrei che si trovassero in una posizione più bassa.

Qualcuno può suggerire un modo per farlo funzionare?


Come suggerito in alcuni commenti che ho aggiornare una (versione semplificata) della mia interrogazione:

query = {"function_score": { 
    "functions": [ 
    {"gauss": {"createdAt": 
     {"origin": "now", "scale": "30d", "offset": "7d", "decay" :0.9 } 
    }}, 
    {"gauss": {"shares.last.twitter_retweets_log": 
     {"origin": 4.52, "scale": 2.61, "decay" : 0.9} 
    }}, 
    ], 
    "query": {"bool":{"must":[ 
    {"exists":{"field": "images"}}, 
    {"multi_match":{"query": "foo boo", fields:["text", "link.title"]}} 
    ]}}, 
    "score_mode": "multiply" 
}}; 

PS: alcuni documenti che possono essere interessanti, come si parla di diversità, ma io non sono sicuro di come applicare:

+2

Puoi mostrare la tua domanda reale e alcuni risultati che stai ottenendo attualmente? Qual è anche il tipo di campo che descrive il tuo utente (cioè stringa o numerico)? – Val

+0

@Val Sto usando una query sul punteggio funzione su elasticSearch 2.1. User.id è una stringa. –

+0

Ti dispiace condividere la tua domanda reale? – Val

risposta

7

È possibile accoppiare il campionatore con l'aggregazione top_hits per ottenere risultati diversificati.

{ 
    "query": { 
     "match": { 
      "query": "iphone" 
     } 
    }, 
    "size":0, 
    "aggs": { 
     "sample": { 
      "sampler": { 
       "shard_size": 200, 
       "field" : "user.id"     
      }, 
      "aggs": { 
       "diversifiedMatches": { 
        "top_hits": { 
         "size":10 
        } 
       } 
      } 
     } 
    } 
} 

Ci sono alcune avvertenze Es:

1) La deduplicazione è per-shard non globale

2) La scelta di campo di diversificazione deve essere un singolo valore di campo

3) No supporto per paginazione

4) Nessun supporto per l'ordinamento su qualcosa di diverso dal punteggio

Affrontare le questioni di cui sopra sarebbe difficile e richiederebbe un coordinamento costoso/complesso internamente più una maggiore guida da parte del cliente su quando e dove i risultati "duplicati" possono essere reintrodotti (pagina 2? pagina 3? quanti?) ecc.

+0

Ho paura di aver bisogno di qualche informazione in più per capire questo, potresti elaborare quello che stai facendo sul campionatore e con i top_hits? E quali implicazioni hanno i valori scelti (200 e 10)? –

+0

Sì, avere 200 e 10 in questo esempio potrebbe essere un po 'strano. Sampler sta filtrando solo per i 200 risultati di maggior punteggio su ciascun frammento (con la restrizione aggiunta che consideriamo solo il documento con il punteggio migliore per ciascun utente univoco.id). Di questo esempio di 200 documenti restituiamo i primi 10 documenti usando top_hits. Nel tuo caso d'uso questi numeri dovrebbero probabilmente essere cambiati per avere lo stesso valore. Altri casi d'uso possono richiedere campioni grandi e quindi risultati minori, ad es. 200 campione e 10 principali significativi agg. – MarkH

+0

Se non capisco male. Questa soluzione implica che puoi vedere una sola volta ogni utente, giusto? Quindi, in un caso di soli 10 risultati significativi tutti provenienti dallo stesso utente, questa soluzione non mostrerà mai gli altri 9 risultati. Mi manca qualcosa? –

Problemi correlati