2014-09-17 8 views
8

C'è un modo per ottenere un campione veramente casuale da un indice elasticsearch? vale a dire una query che recupera qualsiasi documento dall'indice con probabilità 1/N (dove N è il numero di documenti attualmente indicizzati)?Documento casuale in ElasticSearch

E come follow-up domanda: se tutti i documenti hanno un qualche campo numerico s, c'è un modo per ottenere un documento tramite campionamento casuale ponderata, vale a dire in cui la probabilità di ottenere documento i con valore s_i è uguale a s_i/sum(s_j for j in index)?

risposta

17

So che è una vecchia questione, ma ora è possibile usare random_score, con la seguente query di ricerca:

{ 
    "size": 1, 
    "query": { 
     "function_score": { 
     "functions": [ 
      { 
       "random_score": { 
        "seed": "1477072619038" 
       } 
      } 
     ] 
     } 
    } 
} 

Per me è molto veloce con circa 2 milioni di documenti.

Io uso il timestamp corrente come seme, ma puoi usare qualsiasi cosa tu voglia. Il meglio è se usi lo stesso seme, otterrai gli stessi risultati. Quindi puoi usare l'id di sessione dell'utente come seme e tutti gli utenti avranno un ordine diverso.

5

L'unico modo che conosco per ottenere documenti a caso da un indice (almeno nelle versioni < = 1.3.1) è quello di utilizzare uno script:

sort: { 
    _script: { 
    script: "Math.random() * 200000", 
    type: "number", 
    params: {}, 
    order: "asc" 
} 
} 

È possibile utilizzare questo script per fare qualche ponderazione basato su un certo campo del record.

È possibile che in futuro aggiungano qualcosa di più complicato, ma è probabile che tu debba richiederlo dal team di ES.

+0

Impossibile utilizzare seed con questo. n i documenti saranno raggruppati e avranno lo stesso punteggio dove n è la dimensione del frammento. – sudeepdino008

3

È possibile utilizzare random_score con una query function_score.

{ 
    "size":1, 
    "query": { 
     "function_score": { 
      "functions": [ 
       { 
        "random_score": { 
         "seed": 11 
        } 
       } 
      ], 
      "score_mode": "sum", 
     } 
    } 
} 

La parte negativa è che questo applicherà un punteggio casuale per ogni documento, ordinare i documenti, e poi tornare alla prima. Non conosco nulla di abbastanza intelligente da scegliere un documento a caso.