/ / Haystack and Elasticsearch: Limiter le nombre de résultats - django, elasticsearch, pagination, django-haystack

Haystack and Elasticsearch: Limitez le nombre de résultats - django, elasticsearch, pagination, django-haystack

J'ai 2 serveurs avec Haystack:

  • Server1: Cela a elasticsearch installé
  • Serveur2: Cela ne "t pas elasticsearch, les requêtes sont faites à Server1

Mon problème concerne la pagination lorsque je pose des questions à partir de Serveur2 à Server1:

  • Serveur2 fait une requête à Server1
  • Server1 renvoyer tous les résultats à Serveur2
  • Serveur2 fait la pagination

Mais ce n'est pas optimal, si la requête renvoie 10 000 objets, la requête sera lente.

Je sais que vous pouvez envoyer à elasticsearch des valeurs dans la requête (Taille, de et à) mais je ne sais pas si cela est possible en utilisant Meule de foinJ'ai vérifié la documentation, l 'ai googé et rien trouvé.

  • Comment pourrais-je configurer la requête dans Meule de foin recevoir les résultats 10 par 10?
  • Est-ce possible que si je fais SearchQuerySet()[10000:10010] il ne demandera que ces 10 articles?
  • Ou il va demander tous les éléments et ensuite les filtrer?

Edit2

J'ai trouvé ceci sur Haystack Docs:

cela semble être une fonction de faire ce que je suis en train de faire:

Restreint la requête en modifiant le décalage de début, de fin ou les deux.

Et puis j'ai essayé de faire:

from haystack.query import SearchQuerySet

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

Le résultat est la liste complète, comme je n'ai jamais ajouté la ligne set_limit

  • Pourquoi ne fonctionne pas?

Réponses:

3 pour la réponse № 1

Haystack fonctionne un peu différemment de Django ORM. Après avoir limité le nombre de requêtes, appelez get_results () afin d’obtenir des résultats limités. C'est en fait intelligent, car cela évite les demandes multiples d'Elastic.

Exemple:

# 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.

J'espère que ça aide.


-1 pour la réponse № 2

En ajoutant à la réponse Yigit, si vous voulez avoir ces décalages sur les enregistrements filtrés, ajoutez simplement une condition de filtre lorsque vous créez le filtre. SearchQuerySet.

Rappelez-vous également que lorsque les limites sont définies, vous ne pouvez pas les modifier en les définissant à nouveau. Vous devez créer le SearchQuerySet() encore, ou il existe une méthode pour effacer les limites.

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