2015-10-07 17 views
8

Sto lavorando a un'app simile a Tinder. In ElasticSearch ho una collezione di circa mezzo milione di utenti e le loro posizioni). Ogni volta che l'utente apre l'app per cercare utenti nelle vicinanze eseguo una query di ricerca elastica su quella raccolta. La query è abbastanza complessa, prende in considerazione non solo la posizione, ma anche quanto è attivo l'utente o quante foto ha.Come escludere un numero elevato di ID da una query di ricerca elastica

Quello che mi fa fatica è come escludere quegli utenti che l'utente corrente ha già sfogliato dalla query. Un modo ingenuo per implementare questo sarebbe probabilmente quello di mantenere un array annidato di ID utente come parte di ogni documento utente nell'indice ed escludere in base a ciò. Ma dato che ogni utente fa decine di migliaia di colpi, quella matrice potrebbe potenzialmente diventare molto grande, quindi non è una soluzione scalabile.

Esiste un modo per escludere un numero elevato di entità da una query di ricerca elastica basata sui rispettivi ID che non danneggia la performance?

risposta

9

Utilizzare la funzione di ricerca della query Termini: Terms lookup mechanism

quando è necessario specificare un filtro di termini con un sacco di termini può essere utile per andare a prendere quei valori termine da un documento in un indice. Un esempio concreto sarebbe quello di filtrare i tweet tweet dei tuoi follower. Potenzialmente la quantità di ID utente specificata nel filtro termini può essere molto. In questo scenario ha senso usare i termini meccanismo di ricerca dei termini del filtro.

+0

Wow, sembra fantastico, grazie! –

+0

Funziona come un fascino! Quindi entrambe le risposte risolvono sufficientemente il mio problema, ma sto selezionando questo come risposta corretta perché è una soluzione un po 'più elegante. Grazie mille –

+1

Per il beneficio delle persone che verranno a questa domanda in futuro, sarebbe bello vedere la soluzione al lavoro, che implementa il meccanismo di ricerca dei termini. – Val

9

È possibile provare ad aggiungere ids filter in una clausola bool/must_not della query complessa e vedere come si comporta.

{ 
    "query": { 
    "filtered": { 
     "filter": { 
     "bool": { 
      "must": [ 
       ...    <--- your other "must" constraints 
      ], 
      "must_not": [ 
      { 
       "ids": { 
       "values": [ "id1", "id2", "id3" ] <--- your list of ids to exclude 
       } 
      } 
      ] 
     } 
     } 
    } 
    } 
} 
Problemi correlati