Ho 2 server con Haystack:
- Server1: Questo ha installato elasticsearch
- Server2: Questo non ha elasticsearch, le domande sono fatte per Server1
Il mio problema riguarda l'impaginazione quando faccio domande da Server2 a Server1:
- Server2 invia una query a Server1
- Server1 rimanda tutti i risultati a Server2
- Server2 fa l'impaginazione
Ma questo non è ottimale, se la query restituisce 10.000 oggetti, la query sarà lenta.
So che puoi inviare a elasticsearch alcuni valori nella query (taglia, a partire dal e a) ma non so se sia possibile utilizzarlo Pagliaio, Ho controllato la documentazione e cercato su Google e non ho trovato nulla.
- Come posso configurare la query in Pagliaio ricevere i risultati 10 per 10?
- È possibile che se lo faccio
SearchQuerySet()[10000:10010]
chiederà solo questi 10 articoli? - O chiederà tutti gli articoli e poi li filtrerà?
Edit2
L'ho trovato su Haystack Docs:
sembra una funzione per fare quello che sto cercando di fare:
Limita la query modificando l'inizio, la fine o entrambi gli offset.
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 se non avessi mai aggiunto la riga set_limit
- Perché non funziona?
risposte:
3 per risposta № 1Haystack funziona in modo diverso da Django ORM. Dopo aver limitato il set di query, è necessario 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.
Spero che aiuti.
-1 per risposta № 2
Aggiungendo alla risposta Yigit, se si desidera avere questi offset sui record filtrati, è sufficiente aggiungere la condizione di filtro quando si forma il SearchQuerySet
.
Ricorda anche che, una volta impostati i limiti, non puoi modificarli impostandoli di nuovo. Dovresti formare il SearchQuerySet()
di nuovo, 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()