/ / Haystack e Elasticsearch: limitare il numero di risultati - django, elasticsearch, impaginazione, pagliaio django

Haystack ed Elasticsearch: limite numero di risultati - django, elasticsearch, pagination, django-haystack

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 № 1

Haystack 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()