2015-01-05 10 views
5

Ho 2 assistenti con pagliaio:Haystack e elasticsearch: Limita il numero di risultati

  • Server1: Questo ha elasticsearch installato
  • Server2: questo non deve elasticsearch, le query sono fatti a Server1

Il mio problema è di circa l'impaginazione quando faccio le query da S erver2 a Server1:

  • Server2 rende query per Server1
  • Server1 inviare tutti i risultati al Server2
  • Server2 rende l'impaginazione

Ma questo non è ottimale, se la query restituisce 10.000 oggetti, la query sarà lenta.

So che è possibile inviare a elasticsearch alcuni valori nella query (dimensioni, da e a), ma non so se questo è possibile utilizzando Haystack, ho controllato la documentazione e cercò su Google e non trovò nulla.

  • Come potrei configurare la query in Haystack per ricevere i risultati 10 per 10?

Modifica

  • 'possibile che se io faccio SearchQuerySet()[10000:10010] chiederà solo per questo 10 articoli?
  • Oppure chiederà tutti gli articoli e quindi li filtrerà?

Edit2

Ho trovato questo sul mucchio di fieno Documenti:

sembra una funzione per fare whatt che sto cercando di fare:

Restricts the query by altering either the start, end or both offsets.

E poi ho provato a fare:

from haystack.query import SearchQuerySet 

sqs = SearchQuerySet() 
sqs.query.set_limits(low=0, high=4) 
sqs.filter(content='anything') 

Il risultato è l'elenco completo, come non ho mai aggiungere la riga set_limit

  • Perché non funziona?

risposta

3

Il pacco di fieno funziona in modo diverso da Django ORM. Dopo aver limitato il set di query, dovresti chiamare get_results() per ottenere risultati limitati. Questo è in realtà intelligente, perché evita più richieste da Elastic.

Esempio:

# Assume you have 800 records. 
sqs = SearchQuerySet() 
sqs.query.set_limits(low=0, high=4) 
len(sqs) # Will return 800 records 
len(sqs.get_results()) # Will return first 4 records. 

Speranza che aiuta.

+0

Devo provarlo, ho combattuto con il codice molto indietro e non ho trovato informazioni per raggiungerlo. Grazie !! – AlvaroAV

+0

Ottengo questo errore - L'oggetto AttributeError: 'SearchQuerySet' non ha attributo 'get_results'' – garg10may

+0

l'ultima riga deve essere 'len (sqs.query.get_results())' – garg10may

-1

Aggiungendo alla risposta Yigit, se si desidera avere questi offset su record filtrati, aggiungere le condizioni del filtro quando si forma lo SearchQuerySet.

Ricordare anche che, una volta impostati i limiti, non è possibile cambiarli impostandoli di nuovo. Dovresti formare nuovamente lo SearchQuerySet() oppure esiste un metodo per cancellare i limiti.

results = SearchQuerySet().filter(content="keyword") 
#we have a filtered resultSet now let's find specific records 
results.query.set_limits(0,4) 
return results.query.get_results() 
Problemi correlati